| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- // 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 <cinttypes>
- #include "util/set_comparator.h"
- namespace ROCKSDB_NAMESPACE {
- // During recovery if the memtable is flushed we cannot rely on its help on
- // duplicate key detection and as key insert will not be attempted. This class
- // will be used as a emulator of memtable to tell if insertion of a key/seq
- // would have resulted in duplication.
- class DuplicateDetector {
- public:
- explicit DuplicateDetector(DBImpl* db) : db_(db) {}
- bool IsDuplicateKeySeq(uint32_t cf, const Slice& key, SequenceNumber seq) {
- assert(seq >= batch_seq_);
- if (batch_seq_ != seq) { // it is a new batch
- keys_.clear();
- }
- batch_seq_ = seq;
- CFKeys& cf_keys = keys_[cf];
- if (cf_keys.size() == 0) { // just inserted
- InitWithComp(cf);
- }
- auto it = cf_keys.insert(key);
- if (it.second == false) { // second is false if a element already existed.
- keys_.clear();
- InitWithComp(cf);
- keys_[cf].insert(key);
- return true;
- }
- return false;
- }
- private:
- SequenceNumber batch_seq_ = 0;
- DBImpl* db_;
- using CFKeys = std::set<Slice, SetComparator>;
- std::map<uint32_t, CFKeys> keys_;
- void InitWithComp(const uint32_t cf) {
- auto h = db_->GetColumnFamilyHandle(cf);
- if (!h) {
- // TODO(myabandeh): This is not a concern in MyRocks as drop cf is not
- // implemented yet. When it does, we should return proper error instead
- // of throwing exception.
- ROCKS_LOG_FATAL(
- db_->immutable_db_options().info_log,
- "Recovering an entry from the dropped column family %" PRIu32
- ". WAL must must have been emptied before dropping the column "
- "family", cf);
- #ifndef ROCKSDB_LITE
- throw std::runtime_error(
- "Recovering an entry from a dropped column family. "
- "WAL must must have been flushed before dropping the column "
- "family");
- #endif
- return;
- }
- auto cmp = h->GetComparator();
- keys_[cf] = CFKeys(SetComparator(cmp));
- }
- };
- } // namespace ROCKSDB_NAMESPACE
|