Fix BlobDB::Get which only get out the value offset

Summary:
Blob db use StackableDB::get which only get out the
value offset, but not the value.
Fix by making BlobDB::Get override the designated getter.
Closes https://github.com/facebook/rocksdb/pull/2553

Differential Revision: D5396823

Pulled By: yiwu-arbug

fbshipit-source-id: 5a7d1cf77ee44490f836a6537225955382296878
This commit is contained in:
foolenough 2017-07-12 17:56:40 -07:00 committed by Facebook Github Bot
parent 70440f7a63
commit 21b17d7686
4 changed files with 27 additions and 4 deletions

View File

@ -134,7 +134,7 @@ class BlobDB : public StackableDB {
using rocksdb::StackableDB::Get; using rocksdb::StackableDB::Get;
virtual Status Get(const ReadOptions& options, virtual Status Get(const ReadOptions& options,
ColumnFamilyHandle* column_family, const Slice& key, ColumnFamilyHandle* column_family, const Slice& key,
std::string* value) override = 0; PinnableSlice* value) override = 0;
using rocksdb::StackableDB::MultiGet; using rocksdb::StackableDB::MultiGet;
virtual std::vector<Status> MultiGet( virtual std::vector<Status> MultiGet(

View File

@ -1326,7 +1326,7 @@ Status BlobDBImpl::CommonGet(const ColumnFamilyData* cfd, const Slice& key,
Status BlobDBImpl::Get(const ReadOptions& options, Status BlobDBImpl::Get(const ReadOptions& options,
ColumnFamilyHandle* column_family, const Slice& key, ColumnFamilyHandle* column_family, const Slice& key,
std::string* value) { PinnableSlice* value) {
auto cfh = reinterpret_cast<ColumnFamilyHandleImpl*>(column_family); auto cfh = reinterpret_cast<ColumnFamilyHandleImpl*>(column_family);
auto cfd = cfh->cfd(); auto cfd = cfh->cfd();
@ -1341,7 +1341,8 @@ Status BlobDBImpl::Get(const ReadOptions& options,
return s; return s;
} }
s = CommonGet(cfd, key, index_entry, value); s = CommonGet(cfd, key, index_entry, value->GetSelf());
value->PinSelf();
return s; return s;
} }

View File

@ -162,7 +162,7 @@ class BlobDBImpl : public BlobDB {
using rocksdb::StackableDB::Get; using rocksdb::StackableDB::Get;
Status Get(const ReadOptions& options, ColumnFamilyHandle* column_family, Status Get(const ReadOptions& options, ColumnFamilyHandle* column_family,
const Slice& key, std::string* value) override; const Slice& key, PinnableSlice* value) override;
using rocksdb::StackableDB::NewIterator; using rocksdb::StackableDB::NewIterator;
virtual Iterator* NewIterator(const ReadOptions& opts, virtual Iterator* NewIterator(const ReadOptions& opts,

View File

@ -130,6 +130,28 @@ TEST_F(BlobDBTest, Put) {
VerifyDB(data); VerifyDB(data);
} }
TEST_F(BlobDBTest, StackableDBGet) {
Random rnd(301);
BlobDBOptionsImpl bdb_options;
bdb_options.disable_background_tasks = true;
Open(bdb_options);
std::map<std::string, std::string> data;
for (size_t i = 0; i < 100; i++) {
PutRandom("key" + ToString(i), &rnd, &data);
}
for (size_t i = 0; i < 100; i++) {
StackableDB *db = blob_db_;
ColumnFamilyHandle *column_family = db->DefaultColumnFamily();
std::string key = "key" + ToString(i);
PinnableSlice pinnable_value;
ASSERT_OK(db->Get(ReadOptions(), column_family, key, &pinnable_value));
std::string string_value;
ASSERT_OK(db->Get(ReadOptions(), column_family, key, &string_value));
ASSERT_EQ(string_value, pinnable_value.ToString());
ASSERT_EQ(string_value, data[key]);
}
}
TEST_F(BlobDBTest, WriteBatch) { TEST_F(BlobDBTest, WriteBatch) {
Random rnd(301); Random rnd(301);
BlobDBOptionsImpl bdb_options; BlobDBOptionsImpl bdb_options;