do not call merge when checking to see if key exists

Summary:
Changes:
* added check for value before merge is called on code path that should check if key exists
Closes https://github.com/facebook/rocksdb/pull/2814

Reviewed By: IslamAbdelRahman

Differential Revision: D5743966

Pulled By: armishra

fbshipit-source-id: 6ac4283bc510c8ca50827d87ef0ba631f2b33b18
This commit is contained in:
Archit Mishra 2017-09-12 11:41:13 -07:00 committed by Facebook Github Bot
parent 025b85b4ac
commit 3c42807794
1 changed files with 12 additions and 8 deletions

View File

@ -593,10 +593,12 @@ static bool SaveValue(void* arg, const char* entry) {
Slice v = GetLengthPrefixedSlice(key_ptr + key_length); Slice v = GetLengthPrefixedSlice(key_ptr + key_length);
*(s->status) = Status::OK(); *(s->status) = Status::OK();
if (*(s->merge_in_progress)) { if (*(s->merge_in_progress)) {
*(s->status) = MergeHelper::TimedFullMerge( if (s->value != nullptr) {
merge_operator, s->key->user_key(), &v, *(s->status) = MergeHelper::TimedFullMerge(
merge_context->GetOperands(), s->value, s->logger, s->statistics, merge_operator, s->key->user_key(), &v,
s->env_, nullptr /* result_operand */, true); merge_context->GetOperands(), s->value, s->logger,
s->statistics, s->env_, nullptr /* result_operand */, true);
}
} else if (s->value != nullptr) { } else if (s->value != nullptr) {
s->value->assign(v.data(), v.size()); s->value->assign(v.data(), v.size());
} }
@ -610,10 +612,12 @@ static bool SaveValue(void* arg, const char* entry) {
case kTypeSingleDeletion: case kTypeSingleDeletion:
case kTypeRangeDeletion: { case kTypeRangeDeletion: {
if (*(s->merge_in_progress)) { if (*(s->merge_in_progress)) {
*(s->status) = MergeHelper::TimedFullMerge( if (s->value != nullptr) {
merge_operator, s->key->user_key(), nullptr, *(s->status) = MergeHelper::TimedFullMerge(
merge_context->GetOperands(), s->value, s->logger, s->statistics, merge_operator, s->key->user_key(), nullptr,
s->env_, nullptr /* result_operand */, true); merge_context->GetOperands(), s->value, s->logger,
s->statistics, s->env_, nullptr /* result_operand */, true);
}
} else { } else {
*(s->status) = Status::NotFound(); *(s->status) = Status::NotFound();
} }