Summary: PR https://github.com/facebook/rocksdb/issues/5298 (and subsequent related patches) unintentionally changed the semantics of cache_index_and_filter_blocks: historically, this option only affected the main index/filter block; with the changes, it affects index/filter partitions as well. This can cause performance issues when cache_index_and_filter_blocks is false since in this case, partitions are neither cached nor preloaded (i.e. they are loaded on demand upon each access). The patch reverts to the earlier behavior, that is, partitions are cached similarly to data blocks regardless of the value of the above option. Pull Request resolved: https://github.com/facebook/rocksdb/pull/5705 Test Plan: make check ./db_bench -benchmarks=fillrandom --statistics --stats_interval_seconds=1 --duration=30 --num=500000000 --bloom_bits=20 --partition_index_and_filters=true --cache_index_and_filter_blocks=false ./db_bench -benchmarks=readrandom --use_existing_db --statistics --stats_interval_seconds=1 --duration=10 --num=500000000 --bloom_bits=20 --partition_index_and_filters=true --cache_index_and_filter_blocks=false --cache_size=8000000000 Relevant statistics from the readrandom benchmark with the old code: rocksdb.block.cache.index.miss COUNT : 0 rocksdb.block.cache.index.hit COUNT : 0 rocksdb.block.cache.index.add COUNT : 0 rocksdb.block.cache.index.bytes.insert COUNT : 0 rocksdb.block.cache.index.bytes.evict COUNT : 0 rocksdb.block.cache.filter.miss COUNT : 0 rocksdb.block.cache.filter.hit COUNT : 0 rocksdb.block.cache.filter.add COUNT : 0 rocksdb.block.cache.filter.bytes.insert COUNT : 0 rocksdb.block.cache.filter.bytes.evict COUNT : 0 With the new code: rocksdb.block.cache.index.miss COUNT : 2500 rocksdb.block.cache.index.hit COUNT : 42696 rocksdb.block.cache.index.add COUNT : 2500 rocksdb.block.cache.index.bytes.insert COUNT : 4050048 rocksdb.block.cache.index.bytes.evict COUNT : 0 rocksdb.block.cache.filter.miss COUNT : 2500 rocksdb.block.cache.filter.hit COUNT : 4550493 rocksdb.block.cache.filter.add COUNT : 2500 rocksdb.block.cache.filter.bytes.insert COUNT : 10331040 rocksdb.block.cache.filter.bytes.evict COUNT : 0 Differential Revision: D16817382 Pulled By: ltamasi fbshipit-source-id: 28a516b0da1f041a03313e0b70b28cf5cf205d00
56 lines
2.0 KiB
C++
56 lines
2.0 KiB
C++
// 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 <cassert>
|
|
#include "table/block_based/cachable_entry.h"
|
|
#include "table/block_based/filter_block.h"
|
|
|
|
namespace rocksdb {
|
|
|
|
class BlockBasedTable;
|
|
class FilePrefetchBuffer;
|
|
|
|
// Encapsulates common functionality for the various filter block reader
|
|
// implementations. Provides access to the filter block regardless of whether
|
|
// it is owned by the reader or stored in the cache, or whether it is pinned
|
|
// in the cache or not.
|
|
template <typename TBlocklike>
|
|
class FilterBlockReaderCommon : public FilterBlockReader {
|
|
public:
|
|
FilterBlockReaderCommon(const BlockBasedTable* t,
|
|
CachableEntry<TBlocklike>&& filter_block)
|
|
: table_(t), filter_block_(std::move(filter_block)) {
|
|
assert(table_);
|
|
}
|
|
|
|
protected:
|
|
static Status ReadFilterBlock(const BlockBasedTable* table,
|
|
FilePrefetchBuffer* prefetch_buffer,
|
|
const ReadOptions& read_options, bool use_cache,
|
|
GetContext* get_context,
|
|
BlockCacheLookupContext* lookup_context,
|
|
CachableEntry<TBlocklike>* filter_block);
|
|
|
|
const BlockBasedTable* table() const { return table_; }
|
|
const SliceTransform* table_prefix_extractor() const;
|
|
bool whole_key_filtering() const;
|
|
bool cache_filter_blocks() const;
|
|
|
|
Status GetOrReadFilterBlock(bool no_io, GetContext* get_context,
|
|
BlockCacheLookupContext* lookup_context,
|
|
CachableEntry<TBlocklike>* filter_block) const;
|
|
|
|
size_t ApproximateFilterBlockMemoryUsage() const;
|
|
|
|
private:
|
|
const BlockBasedTable* table_;
|
|
CachableEntry<TBlocklike> filter_block_;
|
|
};
|
|
|
|
} // namespace rocksdb
|