Files
scylladb/repair/reader.hh
Tomasz Grabiec 9da3bd84c7 dht: Extract dht::static_sharder
Before the patch, dht::sharder could be instantiated and it would
behave like a static sharder. This is not safe with regards to
extensions of the API because if a derived implementation forgets to
override some method, it would incorrectly default to the
implementation from static sharder. Better to fail the compilation in
this case, so extract static sharder logic to dht::static_sharder
class and make all methods in dht::sharder pure virtual.

This also allows us to have algorithms indicate that they only work
with static sharder by accepting the type, and have compile-time
safety for this requirement.

schema::get_sharder() is changed to return the static_sharder&.
2024-05-16 00:28:47 +02:00

98 lines
2.9 KiB
C++

#pragma once
#include "repair/decorated_key_with_hash.hh"
#include "readers/evictable.hh"
#include "dht/sharder.hh"
#include "reader_permit.hh"
#include "utils/phased_barrier.hh"
#include "readers/mutation_fragment_v1_stream.hh"
#include <fmt/core.h>
class repair_reader {
public:
enum class read_strategy {
local,
multishard_split,
multishard_filter
};
private:
schema_ptr _schema;
reader_permit _permit;
dht::partition_range _range;
// Used to find the range that repair master will work on
dht::selective_token_range_sharder _sharder;
// Seed for the repair row hashing
uint64_t _seed;
// Pin the table while the reader is alive.
// Only needed for local readers, the multishard reader takes care
// of pinning tables on used shards.
std::optional<utils::phased_barrier::operation> _local_read_op;
std::optional<evictable_reader_handle_v2> _reader_handle;
// Fragment stream of either local or multishard reader for the range
mutation_fragment_v1_stream _reader;
// Current partition read from disk
lw_shared_ptr<const decorated_key_with_hash> _current_dk;
uint64_t _reads_issued = 0;
uint64_t _reads_finished = 0;
flat_mutation_reader_v2 make_reader(
seastar::sharded<replica::database>& db,
replica::column_family& cf,
read_strategy strategy,
const dht::sharder& remote_sharder,
unsigned remote_shard,
gc_clock::time_point compaction_time);
public:
repair_reader(
seastar::sharded<replica::database>& db,
replica::column_family& cf,
schema_ptr s,
reader_permit permit,
dht::token_range range,
const dht::static_sharder& remote_sharder,
unsigned remote_shard,
uint64_t seed,
read_strategy strategy,
gc_clock::time_point compaction_time);
future<mutation_fragment_opt>
read_mutation_fragment();
future<> on_end_of_stream() noexcept;
future<> close() noexcept;
lw_shared_ptr<const decorated_key_with_hash>& get_current_dk() {
return _current_dk;
}
void set_current_dk(const dht::decorated_key& key);
void clear_current_dk();
void check_current_dk();
void pause();
};
template <> struct fmt::formatter<repair_reader::read_strategy> : fmt::formatter<string_view> {
auto format(repair_reader::read_strategy s, fmt::format_context& ctx) const {
using enum repair_reader::read_strategy;
std::string_view name = "unknown";
switch (s) {
case local:
name = "local";
break;
case multishard_split:
name = "multishard_split";
break;
case multishard_filter:
name = "multishard_filter";
break;
};
return formatter<string_view>::format(name, ctx);
}
};