replica: Prefer memtable::make_flat_reader_opt() to memtable::make_flat_reader()

The former is significantly cheaper when there is nothing to be read.
This commit is contained in:
Michał Chojnowski
2022-03-13 22:20:31 +01:00
parent 218f2b6e98
commit f211ef9d71
2 changed files with 20 additions and 9 deletions

View File

@@ -759,12 +759,15 @@ memtable::update(db::rp_handle&& h) {
future<>
memtable::apply(memtable& mt, reader_permit permit) {
return with_closeable(mt.make_flat_reader(_schema, std::move(permit)), [this] (auto&& rd) mutable {
return consume_partitions(rd, [self = this->shared_from_this(), &rd] (mutation&& m) {
self->apply(m);
return stop_iteration::no;
if (auto reader_opt = mt.make_flat_reader_opt(_schema, std::move(permit), query::full_partition_range, _schema->full_slice())) {
return with_closeable(std::move(*reader_opt), [this] (auto&& rd) mutable {
return consume_partitions(rd, [self = this->shared_from_this(), &rd] (mutation&& m) {
self->apply(m);
return stop_iteration::no;
});
});
});
}
[[unlikely]] return make_ready_future<>();
}
void

View File

@@ -178,7 +178,9 @@ table::make_reader_v2(schema_ptr s,
// https://github.com/scylladb/scylla/issues/185
for (auto&& mt : *_memtables) {
readers.emplace_back(mt->make_flat_reader(s, permit, range, slice, pc, trace_state, fwd, fwd_mr));
if (auto reader_opt = mt->make_flat_reader_opt(s, permit, range, slice, pc, trace_state, fwd, fwd_mr)) {
readers.emplace_back(std::move(*reader_opt));
}
}
const auto bypass_cache = slice.options.contains(query::partition_slice::option::bypass_cache);
@@ -238,7 +240,9 @@ table::make_streaming_reader(schema_ptr s, reader_permit permit,
std::vector<flat_mutation_reader_v2> readers;
readers.reserve(_memtables->size() + 1);
for (auto&& mt : *_memtables) {
readers.emplace_back(mt->make_flat_reader(s, permit, range, slice, pc, trace_state, fwd, fwd_mr));
if (auto reader_opt = mt->make_flat_reader_opt(s, permit, range, slice, pc, trace_state, fwd, fwd_mr)) {
readers.emplace_back(std::move(*reader_opt));
}
}
readers.emplace_back(make_sstable_reader(s, permit, _sstables, range, slice, pc, std::move(trace_state), fwd, fwd_mr));
return make_combined_reader(s, std::move(permit), std::move(readers), fwd, fwd_mr);
@@ -256,7 +260,9 @@ flat_mutation_reader_v2 table::make_streaming_reader(schema_ptr schema, reader_p
std::vector<flat_mutation_reader_v2> readers;
readers.reserve(_memtables->size() + 1);
for (auto&& mt : *_memtables) {
readers.emplace_back(mt->make_flat_reader(schema, permit, range, slice, pc, trace_state, fwd, fwd_mr));
if (auto reader_opt = mt->make_flat_reader_opt(schema, permit, range, slice, pc, trace_state, fwd, fwd_mr)) {
readers.emplace_back(std::move(*reader_opt));
}
}
readers.emplace_back(make_sstable_reader(schema, permit, _sstables, range, slice, pc, std::move(trace_state), fwd, fwd_mr));
return make_combined_reader(std::move(schema), std::move(permit), std::move(readers), fwd, fwd_mr);
@@ -2319,7 +2325,9 @@ table::make_reader_excluding_sstables(schema_ptr s,
readers.reserve(_memtables->size() + 1);
for (auto&& mt : *_memtables) {
readers.emplace_back(mt->make_flat_reader(s, permit, range, slice, pc, trace_state, fwd, fwd_mr));
if (auto reader_opt = mt->make_flat_reader_opt(s, permit, range, slice, pc, trace_state, fwd, fwd_mr)) {
readers.emplace_back(std::move(*reader_opt));
}
}
auto excluded_ssts = boost::copy_range<std::unordered_set<sstables::shared_sstable>>(excluded);