diff --git a/replica/logstor/segment_manager.cc b/replica/logstor/segment_manager.cc index a45b93a3a9..da959b574d 100644 --- a/replica/logstor/segment_manager.cc +++ b/replica/logstor/segment_manager.cc @@ -410,8 +410,13 @@ private: shared_future<> completion{make_ready_future<>()}; abort_source as; int compaction_disabled_counter{0}; + + bool is_empty() const noexcept { + return !running && compaction_disabled_counter == 0 && completion.available(); + } }; - absl::flat_hash_map> _groups; + using group_compaction_state_map = absl::flat_hash_map>; + group_compaction_state_map _groups; public: compaction_manager_impl(segment_manager_impl& sm, compaction_config cfg) @@ -440,6 +445,12 @@ public: private: + void maybe_erase_state(group_compaction_state_map::iterator it) { + if (it->second->is_empty()) { + _groups.erase(it); + } + } + std::vector select_segments_for_compaction(const segment_descriptor_hist&); future<> do_compact(compaction_group&, abort_source&); future<> compact_segments(compaction_group&, std::vector); @@ -1426,6 +1437,7 @@ future compaction_manager_impl::disable_compaction(compact auto it = _groups.find(&cg); if (it != _groups.end()) { --it->second->compaction_disabled_counter; + maybe_erase_state(it); } }); } @@ -1443,6 +1455,7 @@ compaction_reenabler compaction_manager_impl::disable_compaction_no_wait(compact auto it = _groups.find(&cg); if (it != _groups.end()) { --it->second->compaction_disabled_counter; + maybe_erase_state(it); } }); }