// 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 #ifndef ROCKSDB_LITE #include "rocksdb/utilities/table_properties_collectors.h" namespace rocksdb { // A factory of a table property collector that marks a SST // file as need-compaction when it observe at least "D" deletion // entries in any "N" consecutive entires. class CompactOnDeletionCollectorFactory : public TablePropertiesCollectorFactory { public: // A factory of a table property collector that marks a SST // file as need-compaction when it observe at least "D" deletion // entries in any "N" consecutive entires. // // @param sliding_window_size "N" // @param deletion_trigger "D" CompactOnDeletionCollectorFactory( size_t sliding_window_size, size_t deletion_trigger) : sliding_window_size_(sliding_window_size), deletion_trigger_(deletion_trigger) {} virtual ~CompactOnDeletionCollectorFactory() {} virtual TablePropertiesCollector* CreateTablePropertiesCollector( TablePropertiesCollectorFactory::Context context) override; virtual const char* Name() const override { return "CompactOnDeletionCollector"; } private: size_t sliding_window_size_; size_t deletion_trigger_; }; class CompactOnDeletionCollector : public TablePropertiesCollector { public: CompactOnDeletionCollector( size_t sliding_window_size, size_t deletion_trigger); // AddUserKey() will be called when a new key/value pair is inserted into the // table. // @params key the user key that is inserted into the table. // @params value the value that is inserted into the table. // @params file_size file size up to now virtual Status AddUserKey(const Slice& key, const Slice& value, EntryType type, SequenceNumber seq, uint64_t file_size) override; // Finish() will be called when a table has already been built and is ready // for writing the properties block. // @params properties User will add their collected statistics to // `properties`. virtual Status Finish(UserCollectedProperties* properties) override { Reset(); return Status::OK(); } // Return the human-readable properties, where the key is property name and // the value is the human-readable form of value. virtual UserCollectedProperties GetReadableProperties() const override { return UserCollectedProperties(); } // The name of the properties collector can be used for debugging purpose. virtual const char* Name() const override { return "CompactOnDeletionCollector"; } // EXPERIMENTAL Return whether the output file should be further compacted virtual bool NeedCompact() const override { return need_compaction_; } static const int kNumBuckets = 128; private: void Reset(); // A ring buffer that used to count the number of deletion entries for every // "bucket_size_" keys. size_t num_deletions_in_buckets_[kNumBuckets]; // the number of keys in a bucket size_t bucket_size_; size_t current_bucket_; size_t num_keys_in_current_bucket_; size_t num_deletions_in_observation_window_; size_t deletion_trigger_; // true if the current SST file needs to be compacted. bool need_compaction_; }; } // namespace rocksdb #endif // !ROCKSDB_LITE