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
101 lines
3.2 KiB
C++
101 lines
3.2 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).
|
|
//
|
|
|
|
#include "table/block_based/filter_block_reader_common.h"
|
|
#include "monitoring/perf_context_imp.h"
|
|
#include "table/block_based/block_based_table_reader.h"
|
|
|
|
namespace rocksdb {
|
|
|
|
template <typename TBlocklike>
|
|
Status FilterBlockReaderCommon<TBlocklike>::ReadFilterBlock(
|
|
const BlockBasedTable* table, FilePrefetchBuffer* prefetch_buffer,
|
|
const ReadOptions& read_options, bool use_cache, GetContext* get_context,
|
|
BlockCacheLookupContext* lookup_context,
|
|
CachableEntry<TBlocklike>* filter_block) {
|
|
PERF_TIMER_GUARD(read_filter_block_nanos);
|
|
|
|
assert(table);
|
|
assert(filter_block);
|
|
assert(filter_block->IsEmpty());
|
|
|
|
const BlockBasedTable::Rep* const rep = table->get_rep();
|
|
assert(rep);
|
|
|
|
const Status s =
|
|
table->RetrieveBlock(prefetch_buffer, read_options, rep->filter_handle,
|
|
UncompressionDict::GetEmptyDict(), filter_block,
|
|
BlockType::kFilter, get_context, lookup_context,
|
|
/* for_compaction */ false, use_cache);
|
|
|
|
return s;
|
|
}
|
|
|
|
template <typename TBlocklike>
|
|
const SliceTransform*
|
|
FilterBlockReaderCommon<TBlocklike>::table_prefix_extractor() const {
|
|
assert(table_);
|
|
|
|
const BlockBasedTable::Rep* const rep = table_->get_rep();
|
|
assert(rep);
|
|
|
|
return rep->prefix_filtering ? rep->table_prefix_extractor.get() : nullptr;
|
|
}
|
|
|
|
template <typename TBlocklike>
|
|
bool FilterBlockReaderCommon<TBlocklike>::whole_key_filtering() const {
|
|
assert(table_);
|
|
assert(table_->get_rep());
|
|
|
|
return table_->get_rep()->whole_key_filtering;
|
|
}
|
|
|
|
template <typename TBlocklike>
|
|
bool FilterBlockReaderCommon<TBlocklike>::cache_filter_blocks() const {
|
|
assert(table_);
|
|
assert(table_->get_rep());
|
|
|
|
return table_->get_rep()->table_options.cache_index_and_filter_blocks;
|
|
}
|
|
|
|
template <typename TBlocklike>
|
|
Status FilterBlockReaderCommon<TBlocklike>::GetOrReadFilterBlock(
|
|
bool no_io, GetContext* get_context,
|
|
BlockCacheLookupContext* lookup_context,
|
|
CachableEntry<TBlocklike>* filter_block) const {
|
|
assert(filter_block);
|
|
|
|
if (!filter_block_.IsEmpty()) {
|
|
filter_block->SetUnownedValue(filter_block_.GetValue());
|
|
return Status::OK();
|
|
}
|
|
|
|
ReadOptions read_options;
|
|
if (no_io) {
|
|
read_options.read_tier = kBlockCacheTier;
|
|
}
|
|
|
|
return ReadFilterBlock(table_, nullptr /* prefetch_buffer */, read_options,
|
|
cache_filter_blocks(), get_context, lookup_context,
|
|
filter_block);
|
|
}
|
|
|
|
template <typename TBlocklike>
|
|
size_t FilterBlockReaderCommon<TBlocklike>::ApproximateFilterBlockMemoryUsage()
|
|
const {
|
|
assert(!filter_block_.GetOwnValue() || filter_block_.GetValue() != nullptr);
|
|
return filter_block_.GetOwnValue()
|
|
? filter_block_.GetValue()->ApproximateMemoryUsage()
|
|
: 0;
|
|
}
|
|
|
|
// Explicitly instantiate templates for both "blocklike" types we use.
|
|
// This makes it possible to keep the template definitions in the .cc file.
|
|
template class FilterBlockReaderCommon<BlockContents>;
|
|
template class FilterBlockReaderCommon<Block>;
|
|
|
|
} // namespace rocksdb
|