From f211ef9d712b16e6fed1376ce3f017753738046d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Chojnowski?= Date: Sun, 13 Mar 2022 22:20:31 +0100 Subject: [PATCH] replica: Prefer memtable::make_flat_reader_opt() to memtable::make_flat_reader() The former is significantly cheaper when there is nothing to be read. --- replica/memtable.cc | 13 ++++++++----- replica/table.cc | 16 ++++++++++++---- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/replica/memtable.cc b/replica/memtable.cc index 6303c6b0da..6b1509be42 100644 --- a/replica/memtable.cc +++ b/replica/memtable.cc @@ -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 diff --git a/replica/table.cc b/replica/table.cc index 3213f267a9..df9c1468cb 100644 --- a/replica/table.cc +++ b/replica/table.cc @@ -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 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 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>(excluded);