From be410dede8c02de1d430634bd719d3d8710aa5da Mon Sep 17 00:00:00 2001 From: Yi Wu Date: Fri, 3 Nov 2017 18:10:36 -0700 Subject: [PATCH] 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 --- include/rocksdb/slice.h | 4 ++++ util/slice_test.cc | 1 + utilities/blob_db/blob_db_impl.cc | 11 +++++++---- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/include/rocksdb/slice.h b/include/rocksdb/slice.h index 924f1faef..38e7efb65 100644 --- a/include/rocksdb/slice.h +++ b/include/rocksdb/slice.h @@ -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; } diff --git a/util/slice_test.cc b/util/slice_test.cc index 308e1c312..33903ec72 100644 --- a/util/slice_test.cc +++ b/util/slice_test.cc @@ -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); diff --git a/utilities/blob_db/blob_db_impl.cc b/utilities/blob_db/blob_db_impl.cc index 41c640f17..98ab40376 100644 --- a/utilities/blob_db/blob_db_impl.cc +++ b/utilities/blob_db/blob_db_impl.cc @@ -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); } } -- GitLab