2020-10-01 17:08:52 +00: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).
|
|
|
|
//
|
|
|
|
#pragma once
|
|
|
|
#include "db/dbformat.h"
|
2021-09-29 11:01:57 +00:00
|
|
|
#include "rocksdb/slice.h"
|
2020-10-01 17:08:52 +00:00
|
|
|
#include "rocksdb/status.h"
|
|
|
|
|
|
|
|
namespace ROCKSDB_NAMESPACE {
|
|
|
|
// A class that validates key/value that is inserted to an SST file.
|
|
|
|
// Pass every key/value of the file using OutputValidator::Add()
|
|
|
|
// and the class validates key order and optionally calculate a hash
|
|
|
|
// of all the key and value.
|
|
|
|
class OutputValidator {
|
|
|
|
public:
|
2024-02-01 00:30:26 +00:00
|
|
|
explicit OutputValidator(const InternalKeyComparator& icmp, bool enable_hash,
|
2021-05-20 04:40:43 +00:00
|
|
|
uint64_t precalculated_hash = 0)
|
2020-10-01 17:08:52 +00:00
|
|
|
: icmp_(icmp),
|
2021-05-20 04:40:43 +00:00
|
|
|
paranoid_hash_(precalculated_hash),
|
2020-10-01 17:08:52 +00:00
|
|
|
enable_hash_(enable_hash) {}
|
|
|
|
|
|
|
|
// Add a key to the KV sequence, and return whether the key follows
|
|
|
|
// criteria, e.g. key is ordered.
|
|
|
|
Status Add(const Slice& key, const Slice& value);
|
|
|
|
|
|
|
|
// Compare result of two key orders are the same. It can be used
|
|
|
|
// to compare the keys inserted into a file, and what is read back.
|
|
|
|
// Return true if the validation passes.
|
|
|
|
bool CompareValidator(const OutputValidator& other_validator) {
|
|
|
|
return GetHash() == other_validator.GetHash();
|
|
|
|
}
|
|
|
|
|
2020-11-11 07:41:05 +00:00
|
|
|
// Not (yet) intended to be persisted, so subject to change
|
|
|
|
// without notice between releases.
|
2020-10-01 17:08:52 +00:00
|
|
|
uint64_t GetHash() const { return paranoid_hash_; }
|
|
|
|
|
2021-04-22 20:01:00 +00:00
|
|
|
private:
|
2020-10-01 17:08:52 +00:00
|
|
|
const InternalKeyComparator& icmp_;
|
|
|
|
std::string prev_key_;
|
|
|
|
uint64_t paranoid_hash_ = 0;
|
|
|
|
bool enable_hash_;
|
|
|
|
};
|
|
|
|
} // namespace ROCKSDB_NAMESPACE
|