// be used by a single thread that is doing the compaction run, and this
// call does not need to be thread-safe. However, multiple filters may be
// in existence and operating concurrently.
+ //
+ // The last paragraph is not true if you set max_subcompactions to more than
+ // 1. In that case, subcompaction from multiple threads may call a single
+ // CompactionFilter concurrently.
virtual bool Filter(int level,
const Slice& key,
const Slice& existing_value,
virtual const char* Name() const = 0;
};
-// CompactionFilterV2 that buffers kv pairs sharing the same prefix and let
-// application layer to make individual decisions for all the kv pairs in the
-// buffer.
-class CompactionFilterV2 {
- public:
- virtual ~CompactionFilterV2() {}
-
- // The compaction process invokes this method for all the kv pairs
- // sharing the same prefix. It is a "roll-up" version of CompactionFilter.
- //
- // Each entry in the return vector indicates if the corresponding kv should
- // be preserved in the output of this compaction run. The application can
- // inspect the existing values of the keys and make decision based on it.
- //
- // When a value is to be preserved, the application has the option
- // to modify the entry in existing_values and pass it back through an entry
- // in new_values. A corresponding values_changed entry needs to be set to
- // true in this case. Note that the new_values vector contains only changed
- // values, i.e. new_values.size() <= values_changed.size().
- //
- typedef std::vector<Slice> SliceVector;
- virtual std::vector<bool> Filter(int level,
- const SliceVector& keys,
- const SliceVector& existing_values,
- std::vector<std::string>* new_values,
- std::vector<bool>* values_changed)
- const = 0;
-
- // Returns a name that identifies this compaction filter.
- // The name will be printed to LOG file on start up for diagnosis.
- virtual const char* Name() const = 0;
-};
-
// Each compaction will create a new CompactionFilter allowing the
// application to know about different compactions
class CompactionFilterFactory {
}
};
-// Each compaction will create a new CompactionFilterV2
-//
-// CompactionFilterFactoryV2 enables application to specify a prefix and use
-// CompactionFilterV2 to filter kv-pairs in batches. Each batch contains all
-// the kv-pairs sharing the same prefix.
-//
-// This is useful for applications that require grouping kv-pairs in
-// compaction filter to make a purge/no-purge decision. For example, if the
-// key prefix is user id and the rest of key represents the type of value.
-// This batching filter will come in handy if the application's compaction
-// filter requires knowledge of all types of values for any user id.
-//
-class CompactionFilterFactoryV2 {
- public:
- // NOTE: CompactionFilterFactoryV2 will not delete prefix_extractor
- explicit CompactionFilterFactoryV2(const SliceTransform* prefix_extractor)
- : prefix_extractor_(prefix_extractor) { }
-
- virtual ~CompactionFilterFactoryV2() { }
-
- virtual std::unique_ptr<CompactionFilterV2> CreateCompactionFilterV2(
- const CompactionFilterContext& context) = 0;
-
- // Returns a name that identifies this compaction filter factory.
- virtual const char* Name() const = 0;
-
- const SliceTransform* GetPrefixExtractor() const {
- return prefix_extractor_;
- }
-
- void SetPrefixExtractor(const SliceTransform* prefix_extractor) {
- prefix_extractor_ = prefix_extractor;
- }
-
- private:
- // Prefix extractor for compaction filter v2
- // Keys sharing the same prefix will be buffered internally.
- // Client can implement a Filter callback function to operate on the buffer
- const SliceTransform* prefix_extractor_;
-};
-
-// Default implementation of CompactionFilterFactoryV2 which does not
-// return any filter
-class DefaultCompactionFilterFactoryV2 : public CompactionFilterFactoryV2 {
- public:
- explicit DefaultCompactionFilterFactoryV2()
- : CompactionFilterFactoryV2(nullptr) { }
-
- virtual std::unique_ptr<CompactionFilterV2>
- CreateCompactionFilterV2(
- const CompactionFilterContext& context) override {
- return std::unique_ptr<CompactionFilterV2>(nullptr);
- }
-
- virtual const char* Name() const override {
- return "DefaultCompactionFilterFactoryV2";
- }
-};
-
} // namespace rocksdb
#endif // STORAGE_ROCKSDB_INCLUDE_COMPACTION_FILTER_H_