// 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 #include #include #include #include #include "rocksdb/options.h" #include "rocksdb/slice.h" #include "rocksdb/slice_transform.h" #include "db/dbformat.h" #include "util/hash.h" #include "table/filter_block.h" namespace rocksdb { class FilterPolicy; class FilterBitsBuilder; class FilterBitsReader; // A FullFilterBlockBuilder is used to construct a full filter for a // particular Table. It generates a single string which is stored as // a special block in the Table. // The format of full filter block is: // +----------------------------------------------------------------+ // | full filter for all keys in sst file | // +----------------------------------------------------------------+ // The full filter can be very large. At the end of it, we put // num_probes: how many hash functions are used in bloom filter // class FullFilterBlockBuilder : public FilterBlockBuilder { public: explicit FullFilterBlockBuilder(const SliceTransform* prefix_extractor, bool whole_key_filtering, FilterBitsBuilder* filter_bits_builder); // bits_builder is created in filter_policy, it should be passed in here // directly. and be deleted here ~FullFilterBlockBuilder() {} virtual bool IsBlockBased() override { return false; } virtual void StartBlock(uint64_t block_offset) override {} virtual void Add(const Slice& key) override; virtual Slice Finish(const BlockHandle& tmp, Status* status) override; using FilterBlockBuilder::Finish; protected: virtual void AddKey(const Slice& key); std::unique_ptr filter_bits_builder_; private: // important: all of these might point to invalid addresses // at the time of destruction of this filter block. destructor // should NOT dereference them. const SliceTransform* prefix_extractor_; bool whole_key_filtering_; uint32_t num_added_; std::unique_ptr filter_data_; void AddPrefix(const Slice& key); // No copying allowed FullFilterBlockBuilder(const FullFilterBlockBuilder&); void operator=(const FullFilterBlockBuilder&); }; // A FilterBlockReader is used to parse filter from SST table. // KeyMayMatch and PrefixMayMatch would trigger filter checking class FullFilterBlockReader : public FilterBlockReader { public: // REQUIRES: "contents" and filter_bits_reader must stay live // while *this is live. explicit FullFilterBlockReader(const SliceTransform* prefix_extractor, bool whole_key_filtering, const Slice& contents, FilterBitsReader* filter_bits_reader, Statistics* statistics); explicit FullFilterBlockReader(const SliceTransform* prefix_extractor, bool whole_key_filtering, BlockContents&& contents, FilterBitsReader* filter_bits_reader, Statistics* statistics); // bits_reader is created in filter_policy, it should be passed in here // directly. and be deleted here ~FullFilterBlockReader() {} virtual bool IsBlockBased() override { return false; } virtual bool KeyMayMatch( const Slice& key, uint64_t block_offset = kNotValid, const bool no_io = false, const Slice* const const_ikey_ptr = nullptr) override; virtual bool PrefixMayMatch( const Slice& prefix, uint64_t block_offset = kNotValid, const bool no_io = false, const Slice* const const_ikey_ptr = nullptr) override; virtual size_t ApproximateMemoryUsage() const override; private: const SliceTransform* prefix_extractor_; Slice contents_; std::unique_ptr filter_bits_reader_; BlockContents block_contents_; std::unique_ptr filter_data_; // No copying allowed FullFilterBlockReader(const FullFilterBlockReader&); bool MayMatch(const Slice& entry); void operator=(const FullFilterBlockReader&); }; } // namespace rocksdb