diff --git a/db_stress_tool/no_batched_ops_stress.cc b/db_stress_tool/no_batched_ops_stress.cc index c14487da8..58e32016d 100644 --- a/db_stress_tool/no_batched_ops_stress.cc +++ b/db_stress_tool/no_batched_ops_stress.cc @@ -84,8 +84,8 @@ class NonBatchedOpsStressTest : public StressTest { // move to the next item in the iterator s = Status::NotFound(); } - VerifyValue(static_cast(cf), i, options, shared, from_db, s, - true); + VerifyOrSyncValue(static_cast(cf), i, options, shared, from_db, + s, true); if (from_db.length()) { PrintKeyValue(static_cast(cf), static_cast(i), from_db.data(), from_db.length()); @@ -101,8 +101,8 @@ class NonBatchedOpsStressTest : public StressTest { std::string keystr = Key(i); Slice k = keystr; Status s = db_->Get(options, column_families_[cf], k, &from_db); - VerifyValue(static_cast(cf), i, options, shared, from_db, s, - true); + VerifyOrSyncValue(static_cast(cf), i, options, shared, from_db, + s, true); if (from_db.length()) { PrintKeyValue(static_cast(cf), static_cast(i), from_db.data(), from_db.length()); @@ -130,8 +130,8 @@ class NonBatchedOpsStressTest : public StressTest { for (size_t j = 0; j < batch_size; ++j) { Status s = statuses[j]; std::string from_db = values[j].ToString(); - VerifyValue(static_cast(cf), i + j, options, shared, from_db, - s, true); + VerifyOrSyncValue(static_cast(cf), i + j, options, shared, + from_db, s, true); if (from_db.length()) { PrintKeyValue(static_cast(cf), static_cast(i + j), from_db.data(), from_db.length()); @@ -174,8 +174,8 @@ class NonBatchedOpsStressTest : public StressTest { if (number_of_operands) { from_db = values[number_of_operands - 1].ToString(); } - VerifyValue(static_cast(cf), i, options, shared, from_db, s, - true); + VerifyOrSyncValue(static_cast(cf), i, options, shared, from_db, + s, true); if (from_db.length()) { PrintKeyValue(static_cast(cf), static_cast(i), from_db.data(), from_db.length()); @@ -562,8 +562,8 @@ class NonBatchedOpsStressTest : public StressTest { Slice k = key_str2; std::string from_db; Status s = db_->Get(read_opts, cfh, k, &from_db); - if (!VerifyValue(rand_column_family, rand_key, read_opts, shared, from_db, - s, true)) { + if (!VerifyOrSyncValue(rand_column_family, rand_key, read_opts, shared, + from_db, s, true)) { return s; } } @@ -882,16 +882,24 @@ class NonBatchedOpsStressTest : public StressTest { } #endif // ROCKSDB_LITE - bool VerifyValue(int cf, int64_t key, const ReadOptions& /*opts*/, - SharedState* shared, const std::string& value_from_db, - const Status& s, bool strict = false) const { + bool VerifyOrSyncValue(int cf, int64_t key, const ReadOptions& /*opts*/, + SharedState* shared, const std::string& value_from_db, + const Status& s, bool strict = false) const { if (shared->HasVerificationFailedYet()) { return false; } // compare value_from_db with the value in the shared state - char value[kValueMaxLen]; uint32_t value_base = shared->Get(cf, key); if (value_base == SharedState::UNKNOWN_SENTINEL) { + if (s.ok()) { + // Value exists in db, update state to reflect that + Slice slice(value_from_db); + value_base = GetValueBase(slice); + shared->Put(cf, key, value_base, false); + } else if (s.IsNotFound()) { + // Value doesn't exist in db, update state to reflect that + shared->SingleDelete(cf, key, false); + } return true; } if (value_base == SharedState::DELETION_SENTINEL && !strict) { @@ -899,6 +907,7 @@ class NonBatchedOpsStressTest : public StressTest { } if (s.ok()) { + char value[kValueMaxLen]; if (value_base == SharedState::DELETION_SENTINEL) { VerificationAbort(shared, "Unexpected value found", cf, key); return false;