Before this patch, `reader_permit` taken by `bti_index_reader`. wasn't actually being passed down to disk reads. In this patch, we fix this FIXME by propagating the permit down to the I/O operations on the `cached_file`. Also, it didn't take `trace_state_ptr` at all. In this patch, we add a `trace_state_ptr` argument and propagate it down to disk reads. (We combine the two changes because the permit and the trace state are passed together everywhere anyway).
68 lines
2.7 KiB
C++
68 lines
2.7 KiB
C++
/*
|
|
* Copyright (C) 2024-present ScyllaDB
|
|
*/
|
|
|
|
/*
|
|
* SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "utils/cached_file.hh"
|
|
#include "node_reader.hh"
|
|
|
|
namespace sstables {
|
|
[[noreturn, gnu::noinline]] void on_bti_parse_error(uint64_t pos);
|
|
}
|
|
|
|
namespace sstables::trie {
|
|
|
|
// Implementation of concept `node_reader`.
|
|
get_child_result bti_get_child(uint64_t pos, const_bytes sp, int child_idx, bool forward);
|
|
std::byte bti_get_child_transition(uint64_t pos, const_bytes raw, int idx);
|
|
load_final_node_result bti_read_node(int64_t pos, const_bytes sp);
|
|
const_bytes bti_get_payload(int64_t pos, const_bytes sp);
|
|
node_traverse_result bti_walk_down_along_key(int64_t pos, const_bytes sp, const_bytes key);
|
|
node_traverse_sidemost_result bti_walk_down_leftmost_path(int64_t pos, const_bytes sp);
|
|
node_traverse_sidemost_result bti_walk_down_rightmost_path(int64_t pos, const_bytes sp);
|
|
|
|
// Deals with BTI-specific parts of trie traversal.
|
|
// (I.e. the parts which understand the BTI serialization format).
|
|
//
|
|
// (We talk about "traversal" and not "deserialization" because we don't actually
|
|
// want to deserialize the full nodes, we only want to walk over them.)
|
|
//
|
|
// See comments for concept `node_reader` for a description of the methods.
|
|
struct bti_node_reader {
|
|
// A copy-constructible wrapper over cached_file::ptr_type.
|
|
// (Automatically calls share() on copy).
|
|
struct page_ptr : cached_file::ptr_type {
|
|
using parent = cached_file::ptr_type;
|
|
page_ptr() noexcept = default;
|
|
page_ptr(parent&& x) noexcept : parent(std::move(x)) {}
|
|
page_ptr(const page_ptr& other) noexcept : parent(other ? other->share() : nullptr) {}
|
|
page_ptr(page_ptr&&) noexcept = default;
|
|
page_ptr& operator=(page_ptr&&) noexcept = default;
|
|
page_ptr& operator=(const page_ptr& other) noexcept {
|
|
parent::operator=(other ? other->share() : nullptr);
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
page_ptr _cached_page;
|
|
std::reference_wrapper<cached_file> _file;
|
|
|
|
bti_node_reader(cached_file& f);
|
|
bool cached(int64_t pos) const;
|
|
future<> load(int64_t pos, const reader_permit&, const tracing::trace_state_ptr&);
|
|
trie::load_final_node_result read_node(int64_t pos);
|
|
trie::node_traverse_result walk_down_along_key(int64_t pos, const_bytes key);
|
|
trie::node_traverse_sidemost_result walk_down_leftmost_path(int64_t pos);
|
|
trie::node_traverse_sidemost_result walk_down_rightmost_path(int64_t pos);
|
|
trie::get_child_result get_child(int64_t pos, int child_idx, bool forward) const;
|
|
const_bytes get_payload(int64_t pos) const;
|
|
};
|
|
static_assert(node_reader<bti_node_reader>);
|
|
|
|
} // namespace sstables::trie
|