table: Avoid useless allocations when updating cache on memtable flush completion
we're unconditionally using make_combined_mutation_source(), which causes extra allocations, even if memtable was flushed into a single sstable, which is the most common case. memtable will only be flushed into more than one sstable if TWCS is used and memtable had old data written into it due to out-of-order writes. Signed-off-by: Raphael S. Carvalho <raphaelsc@scylladb.com> Message-Id: <20210205182028.439948-1-raphaelsc@scylladb.com>
This commit is contained in:
committed by
Avi Kivity
parent
7910e745bc
commit
e1261d10f1
17
table.cc
17
table.cc
@@ -389,13 +389,18 @@ table::add_sstable_and_update_cache(sstables::shared_sstable sst) {
|
||||
|
||||
future<>
|
||||
table::update_cache(lw_shared_ptr<memtable> m, std::vector<sstables::shared_sstable> ssts) {
|
||||
std::vector<mutation_source> sources;
|
||||
sources.reserve(ssts.size());
|
||||
for (auto& sst : ssts) {
|
||||
sources.push_back(sst->as_mutation_source());
|
||||
mutation_source_opt ms_opt;
|
||||
if (ssts.size() == 1) {
|
||||
ms_opt = ssts.front()->as_mutation_source();
|
||||
} else {
|
||||
std::vector<mutation_source> sources;
|
||||
sources.reserve(ssts.size());
|
||||
for (auto& sst : ssts) {
|
||||
sources.push_back(sst->as_mutation_source());
|
||||
}
|
||||
ms_opt = make_combined_mutation_source(std::move(sources));
|
||||
}
|
||||
auto new_ssts_ms = make_combined_mutation_source(std::move(sources));
|
||||
auto adder = row_cache::external_updater([this, m, ssts = std::move(ssts), new_ssts_ms = std::move(new_ssts_ms)] () mutable {
|
||||
auto adder = row_cache::external_updater([this, m, ssts = std::move(ssts), new_ssts_ms = std::move(*ms_opt)] () mutable {
|
||||
for (auto& sst : ssts) {
|
||||
add_sstable(sst);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user