Fix WriteBatchWithIndex with MergeOperator bug (#5577)

Summary:
```
TEST_F(WriteBatchWithIndexTest, TestGetFromBatchAndDBMerge3) {
  DB* db;
  Options options;

  options.create_if_missing = true;
  std::string dbname = test::PerThreadDBPath("write_batch_with_index_test");

  options.merge_operator = MergeOperators::CreateFromStringId("stringappend");

  DestroyDB(dbname, options);
  Status s = DB::Open(options, dbname, &db);
  assert(s.ok());

  ReadOptions read_options;
  WriteOptions write_options;
  FlushOptions flush_options;
  std::string value;

  WriteBatchWithIndex batch;

  ASSERT_OK(db->Put(write_options, "A", "1"));
  ASSERT_OK(db->Flush(flush_options, db->DefaultColumnFamily()));
  ASSERT_OK(batch.Merge("A", "2"));

  ASSERT_OK(batch.GetFromBatchAndDB(db, read_options, "A", &value));
  ASSERT_EQ(value, "1,2");

  delete db;
  DestroyDB(dbname, options);
}
```
Fix ASSERT in batch.GetFromBatchAndDB()
Pull Request resolved: https://github.com/facebook/rocksdb/pull/5577

Differential Revision: D16379847

fbshipit-source-id: b1320e24ec8e71350c525083cc0a16180a63f752
This commit is contained in:
奏之章 2019-09-05 17:50:45 -07:00 committed by Facebook Github Bot
parent cfc20019d1
commit 533e47709c
2 changed files with 36 additions and 1 deletions

View File

@ -917,9 +917,12 @@ Status WriteBatchWithIndex::GetFromBatchAndDB(
}
if (merge_operator) {
std::string merge_result;
s = MergeHelper::TimedFullMerge(
merge_operator, key, merge_data, merge_context.GetOperands(),
pinnable_val->GetSelf(), logger, statistics, env);
&merge_result, logger, statistics, env);
pinnable_val->Reset();
*pinnable_val->GetSelf() = std::move(merge_result);
pinnable_val->PinSelf();
} else {
s = Status::InvalidArgument("Options::merge_operator must be set");

View File

@ -1308,6 +1308,38 @@ TEST_F(WriteBatchWithIndexTest, TestGetFromBatchAndDBMerge2) {
DestroyDB(dbname, options);
}
TEST_F(WriteBatchWithIndexTest, TestGetFromBatchAndDBMerge3) {
DB* db;
Options options;
options.create_if_missing = true;
std::string dbname = test::PerThreadDBPath("write_batch_with_index_test");
options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
DestroyDB(dbname, options);
Status s = DB::Open(options, dbname, &db);
assert(s.ok());
ReadOptions read_options;
WriteOptions write_options;
FlushOptions flush_options;
std::string value;
WriteBatchWithIndex batch;
ASSERT_OK(db->Put(write_options, "A", "1"));
ASSERT_OK(db->Flush(flush_options, db->DefaultColumnFamily()));
ASSERT_OK(batch.Merge("A", "2"));
ASSERT_OK(batch.GetFromBatchAndDB(db, read_options, "A", &value));
ASSERT_EQ(value, "1,2");
delete db;
DestroyDB(dbname, options);
}
void AssertKey(std::string key, WBWIIterator* iter) {
ASSERT_TRUE(iter->Valid());
ASSERT_EQ(key, iter->Entry().key.ToString());