@ -78,6 +78,10 @@ class CompactionFilter {
// be used by a single thread that is doing the compaction run, and this
// 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
// call does not need to be thread-safe. However, multiple filters may be
// in existence and operating concurrently.
// 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 ,
virtual bool Filter ( int level ,
const Slice & key ,
const Slice & key ,
const Slice & existing_value ,
const Slice & existing_value ,
@ -97,39 +101,6 @@ class CompactionFilter {
virtual const char * Name ( ) const = 0 ;
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
// Each compaction will create a new CompactionFilter allowing the
// application to know about different compactions
// application to know about different compactions
class CompactionFilterFactory {
class CompactionFilterFactory {
@ -157,65 +128,6 @@ class DefaultCompactionFilterFactory : public 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
} // namespace rocksdb
# endif // STORAGE_ROCKSDB_INCLUDE_COMPACTION_FILTER_H_
# endif // STORAGE_ROCKSDB_INCLUDE_COMPACTION_FILTER_H_