Fix PinnableSlice move assignment

Summary:
After move assignment, we need to re-initialized the moved PinnableSlice.

Also update blob_db_impl.cc to not reuse the moved PinnableSlice since it is supposed to be in an undefined state after move.
Closes https://github.com/facebook/rocksdb/pull/3127

Differential Revision: D6238585

Pulled By: yiwu-arbug

fbshipit-source-id: bd99f2e37406c4f7de160c7dee6a2e8126bc224e
This commit is contained in:
Yi Wu 2017-11-03 18:10:36 -07:00
parent a0016dc358
commit c3efe60855
3 changed files with 12 additions and 4 deletions

View File

@ -150,6 +150,10 @@ class PinnableSlice : public Slice, public Cleanable {
} else {
buf_ = other.buf_;
}
// Re-initialize the other PinnablaeSlice.
other.self_space_.clear();
other.buf_ = &other.self_space_;
other.pinned_ = false;
}
return *this;
}

View File

@ -47,6 +47,7 @@ TEST_F(SliceTest, PinnableSliceMoveConstruct) {
ASSERT_EQ("bar", s2->ToString());
s2->RegisterCleanup(BumpCounter, &orig_cleanup, nullptr);
*s2 = std::move(*s1);
ASSERT_FALSE(s1->IsPinned());
ASSERT_EQ("foo", s2->ToString());
ASSERT_EQ(1, orig_cleanup);
ASSERT_EQ(0, moved_cleanup);

View File

@ -1226,13 +1226,16 @@ Status BlobDBImpl::Get(const ReadOptions& read_options,
Status s;
bool is_blob_index = false;
s = db_impl_->GetImpl(ro, column_family, key, value, nullptr /*value_found*/,
nullptr /*read_callback*/, &is_blob_index);
PinnableSlice index_entry;
s = db_impl_->GetImpl(ro, column_family, key, &index_entry,
nullptr /*value_found*/, nullptr /*read_callback*/,
&is_blob_index);
TEST_SYNC_POINT("BlobDBImpl::Get:AfterIndexEntryGet:1");
TEST_SYNC_POINT("BlobDBImpl::Get:AfterIndexEntryGet:2");
if (s.ok()) {
if (is_blob_index) {
PinnableSlice index_entry = std::move(*value);
if (!is_blob_index) {
*value = std::move(index_entry);
} else {
s = GetBlobValue(key, index_entry, value);
}
}