2020-10-01 19:08:52 +02:00
|
|
|
// 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"
|
|
|
|
|
2021-09-29 13:01:57 +02:00
|
|
|
#include "test_util/sync_point.h"
|
|
|
|
#include "util/hash.h"
|
|
|
|
|
2020-10-01 19:08:52 +02:00
|
|
|
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
|
2020-11-11 08:41:05 +01:00
|
|
|
paranoid_hash_ = NPHash64(key.data(), key.size(), paranoid_hash_);
|
|
|
|
paranoid_hash_ = NPHash64(value.data(), value.size(), paranoid_hash_);
|
2020-10-01 19:08:52 +02:00
|
|
|
}
|
|
|
|
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
|