// 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. #include "table/block_based/index_reader_common.h" #include "rocksdb/table_pinning_policy.h" #include "table/block_based/block_cache.h" namespace ROCKSDB_NAMESPACE { BlockBasedTable::IndexReaderCommon::~IndexReaderCommon() { table_->UnPinData(std::move(pinned_)); } Status BlockBasedTable::IndexReaderCommon::ReadIndexBlock( const BlockBasedTable* table, FilePrefetchBuffer* prefetch_buffer, const ReadOptions& read_options, bool use_cache, GetContext* get_context, BlockCacheLookupContext* lookup_context, CachableEntry* index_block) { PERF_TIMER_GUARD(read_index_block_nanos); assert(table != nullptr); assert(index_block != nullptr); assert(index_block->IsEmpty()); const Rep* const rep = table->get_rep(); assert(rep != nullptr); const Status s = table->RetrieveBlock( prefetch_buffer, read_options, rep->footer.index_handle(), UncompressionDict::GetEmptyDict(), &index_block->As(), get_context, lookup_context, /* for_compaction */ false, use_cache, /* async_read */ false); return s; } Status BlockBasedTable::IndexReaderCommon::GetOrReadIndexBlock( bool no_io, Env::IOPriority rate_limiter_priority, GetContext* get_context, BlockCacheLookupContext* lookup_context, CachableEntry* index_block) const { assert(index_block != nullptr); if (!index_block_.IsEmpty()) { index_block->SetUnownedValue(index_block_.GetValue()); return Status::OK(); } ReadOptions read_options; read_options.rate_limiter_priority = rate_limiter_priority; if (no_io) { read_options.read_tier = kBlockCacheTier; } return ReadIndexBlock(table_, /*prefetch_buffer=*/nullptr, read_options, cache_index_blocks(), get_context, lookup_context, index_block); } } // namespace ROCKSDB_NAMESPACE