mirror of
https://github.com/scylladb/scylladb.git
synced 2026-05-12 19:02:12 +00:00
Merge 'view_update_generator: use partitioned sstable set'
from Botond. Recently it was observed (#6603) that since 4e6400293ea, the staging reader is reading from a lot of sstables (200+). This consumes a lot of memory, and after this reaches a certain threshold -- the entire memory amount of the streaming reader concurrency semaphore -- it can cause a deadlock within the view update generation. To reduce this memory usage, we exploit the fact that the staging sstables are usually disjoint, and use the partitioned sstable set to create the staging reader. This should ensure that only the minimum number of sstable readers will be opened at any time. Refs: #6603 Fixes: #6707 Tests: unit(dev) * 'view-update-generator-use-partitioned-set/v1' of https://github.com/denesb/scylla: db/view: view_update_generator: use partitioned sstable set sstables: make_partitioned_sstable_set(): return an sstable_set
This commit is contained in:
@@ -51,10 +51,10 @@ future<> view_update_generator::start() {
|
||||
auto sstables = std::exchange(_sstables_with_tables[t], {});
|
||||
|
||||
try {
|
||||
// temporary: need an sstable set for the flat mutation reader, but the
|
||||
// compaction_descriptor takes a vector. Soon this will become a compaction
|
||||
// so the transformation to the SSTable set will not be needed.
|
||||
auto ssts = make_lw_shared(t->get_compaction_strategy().make_sstable_set(s));
|
||||
// Exploit the fact that sstables in the staging directory
|
||||
// are usually non-overlapping and use a partitioned set for
|
||||
// the read.
|
||||
auto ssts = make_lw_shared(sstables::make_partitioned_sstable_set(s, make_lw_shared<sstable_list>(sstable_list{}), false));
|
||||
for (auto& sst : sstables) {
|
||||
ssts->insert(sst);
|
||||
}
|
||||
|
||||
@@ -438,8 +438,8 @@ std::unique_ptr<sstable_set_impl> leveled_compaction_strategy::make_sstable_set(
|
||||
return std::make_unique<partitioned_sstable_set>(std::move(schema));
|
||||
}
|
||||
|
||||
std::unique_ptr<sstable_set_impl> make_partitioned_sstable_set(schema_ptr schema, bool use_level_metadata) {
|
||||
return std::make_unique<partitioned_sstable_set>(std::move(schema), use_level_metadata);
|
||||
sstable_set make_partitioned_sstable_set(schema_ptr schema, lw_shared_ptr<sstable_list> all, bool use_level_metadata) {
|
||||
return sstables::sstable_set(std::make_unique<partitioned_sstable_set>(schema, use_level_metadata), schema, std::move(all));
|
||||
}
|
||||
|
||||
compaction_descriptor compaction_strategy_impl::get_major_compaction_job(column_family& cf, std::vector<sstables::shared_sstable> candidates) {
|
||||
|
||||
@@ -101,7 +101,7 @@ public:
|
||||
incremental_selector make_incremental_selector() const;
|
||||
};
|
||||
|
||||
std::unique_ptr<sstable_set_impl> make_partitioned_sstable_set(schema_ptr schema, bool use_level_metadata = true);
|
||||
sstable_set make_partitioned_sstable_set(schema_ptr schema, lw_shared_ptr<sstable_list> all, bool use_level_metadata = true);
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const sstables::sstable_run& run);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user