| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- // 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).
- //
- // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file. See the AUTHORS file for names of contributors.
- #pragma once
- #include "table/block_based/block_based_table_reader.h"
- #include "table/block_based/reader_common.h"
- namespace ROCKSDB_NAMESPACE {
- // Encapsulates common functionality for the various index reader
- // implementations. Provides access to the index 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.
- class BlockBasedTable::IndexReaderCommon : public BlockBasedTable::IndexReader {
- public:
- IndexReaderCommon(const BlockBasedTable* t,
- CachableEntry<Block>&& index_block)
- : table_(t), index_block_(std::move(index_block)) {
- assert(table_ != nullptr);
- }
- void EraseFromCacheBeforeDestruction(
- uint32_t /*uncache_aggressiveness*/) override;
- protected:
- static Status ReadIndexBlock(const BlockBasedTable* table,
- FilePrefetchBuffer* prefetch_buffer,
- const ReadOptions& read_options, bool use_cache,
- GetContext* get_context,
- BlockCacheLookupContext* lookup_context,
- CachableEntry<Block>* index_block);
- const BlockBasedTable* table() const { return table_; }
- const InternalKeyComparator* internal_comparator() const {
- assert(table_ != nullptr);
- assert(table_->get_rep() != nullptr);
- return &table_->get_rep()->internal_comparator;
- }
- bool index_has_first_key() const {
- assert(table_ != nullptr);
- assert(table_->get_rep() != nullptr);
- return table_->get_rep()->index_has_first_key;
- }
- bool index_key_includes_seq() const {
- assert(table_ != nullptr);
- assert(table_->get_rep() != nullptr);
- return table_->get_rep()->index_key_includes_seq;
- }
- bool index_value_is_full() const {
- assert(table_ != nullptr);
- assert(table_->get_rep() != nullptr);
- return table_->get_rep()->index_value_is_full;
- }
- bool cache_index_blocks() const {
- assert(table_ != nullptr);
- assert(table_->get_rep() != nullptr);
- return table_->get_rep()->table_options.cache_index_and_filter_blocks;
- }
- bool user_defined_timestamps_persisted() const {
- assert(table_ != nullptr);
- assert(table_->get_rep() != nullptr);
- return table_->get_rep()->user_defined_timestamps_persisted;
- }
- Status GetOrReadIndexBlock(GetContext* get_context,
- BlockCacheLookupContext* lookup_context,
- CachableEntry<Block>* index_block,
- const ReadOptions& read_options) const;
- size_t ApproximateIndexBlockMemoryUsage() const {
- assert(!index_block_.GetOwnValue() || index_block_.GetValue() != nullptr);
- return index_block_.GetOwnValue()
- ? index_block_.GetValue()->ApproximateMemoryUsage()
- : 0;
- }
- private:
- const BlockBasedTable* table_;
- CachableEntry<Block> index_block_;
- };
- } // namespace ROCKSDB_NAMESPACE
|