summaryrefslogtreecommitdiffstats
path: root/src/rocksdb/db/output_validator.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/rocksdb/db/output_validator.cc')
-rw-r--r--src/rocksdb/db/output_validator.cc33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/rocksdb/db/output_validator.cc b/src/rocksdb/db/output_validator.cc
new file mode 100644
index 000000000..e93e2d68c
--- /dev/null
+++ b/src/rocksdb/db/output_validator.cc
@@ -0,0 +1,33 @@
+// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
+// This source code is licensed under both the GPLv2 (found in the
+// COPYING file in the root directory) and Apache 2.0 License
+// (found in the LICENSE.Apache file in the root directory).
+//
+#include "db/output_validator.h"
+
+#include "test_util/sync_point.h"
+#include "util/hash.h"
+
+namespace ROCKSDB_NAMESPACE {
+Status OutputValidator::Add(const Slice& key, const Slice& value) {
+ if (enable_hash_) {
+ // Generate a rolling 64-bit hash of the key and values
+ paranoid_hash_ = NPHash64(key.data(), key.size(), paranoid_hash_);
+ paranoid_hash_ = NPHash64(value.data(), value.size(), paranoid_hash_);
+ }
+ if (enable_order_check_) {
+ TEST_SYNC_POINT_CALLBACK("OutputValidator::Add:order_check",
+ /*arg=*/nullptr);
+ if (key.size() < kNumInternalBytes) {
+ return Status::Corruption(
+ "Compaction tries to write a key without internal bytes.");
+ }
+ // prev_key_ starts with empty.
+ if (!prev_key_.empty() && icmp_.Compare(key, prev_key_) < 0) {
+ return Status::Corruption("Compaction sees out-of-order keys.");
+ }
+ prev_key_.assign(key.data(), key.size());
+ }
+ return Status::OK();
+}
+} // namespace ROCKSDB_NAMESPACE