d92a59b6f2
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
67 lines
2.2 KiB
C++
67 lines
2.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).
|
|
//
|
|
|
|
#pragma once
|
|
|
|
#include <cassert>
|
|
#include "table/block_based/cachable_entry.h"
|
|
#include "table/format.h"
|
|
|
|
namespace rocksdb {
|
|
|
|
class BlockBasedTable;
|
|
struct BlockCacheLookupContext;
|
|
class FilePrefetchBuffer;
|
|
class GetContext;
|
|
struct ReadOptions;
|
|
struct UncompressionDict;
|
|
|
|
// Provides access to the uncompression dictionary regardless of whether
|
|
// it is owned by the reader or stored in the cache, or whether it is pinned
|
|
// in the cache or not.
|
|
class UncompressionDictReader {
|
|
public:
|
|
static Status Create(
|
|
const BlockBasedTable* table, FilePrefetchBuffer* prefetch_buffer,
|
|
bool use_cache, bool prefetch, bool pin,
|
|
BlockCacheLookupContext* lookup_context,
|
|
std::unique_ptr<UncompressionDictReader>* uncompression_dict_reader);
|
|
|
|
Status GetOrReadUncompressionDictionary(
|
|
FilePrefetchBuffer* prefetch_buffer, bool no_io, GetContext* get_context,
|
|
BlockCacheLookupContext* lookup_context,
|
|
UncompressionDict* uncompression_dict) const;
|
|
|
|
size_t ApproximateMemoryUsage() const;
|
|
|
|
private:
|
|
UncompressionDictReader(
|
|
const BlockBasedTable* t,
|
|
CachableEntry<BlockContents>&& uncompression_dict_block)
|
|
: table_(t),
|
|
uncompression_dict_block_(std::move(uncompression_dict_block)) {
|
|
assert(table_);
|
|
}
|
|
|
|
bool cache_dictionary_blocks() const;
|
|
|
|
static Status ReadUncompressionDictionaryBlock(
|
|
const BlockBasedTable* table, FilePrefetchBuffer* prefetch_buffer,
|
|
const ReadOptions& read_options, bool use_cache, GetContext* get_context,
|
|
BlockCacheLookupContext* lookup_context,
|
|
CachableEntry<BlockContents>* uncompression_dict_block);
|
|
|
|
Status GetOrReadUncompressionDictionaryBlock(
|
|
FilePrefetchBuffer* prefetch_buffer, bool no_io, GetContext* get_context,
|
|
BlockCacheLookupContext* lookup_context,
|
|
CachableEntry<BlockContents>* uncompression_dict_block) const;
|
|
|
|
const BlockBasedTable* table_;
|
|
CachableEntry<BlockContents> uncompression_dict_block_;
|
|
};
|
|
|
|
} // namespace rocksdb
|