From 4be718ebfaac6d028582d8ce4fe0fd2f27f9419f Mon Sep 17 00:00:00 2001 From: Calle Wilund Date: Tue, 5 Jan 2021 15:30:54 +0000 Subject: [PATCH] commitlog: Force earlier cycle/flush iff segment reserve is empty Attempt to hurry flushing/segment delete/recycle if we are trying to get a segment for allocation, and reserve is empty when above disk threshold. This is minimize time waited in allocation semaphore. --- db/commitlog/commitlog.cc | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/db/commitlog/commitlog.cc b/db/commitlog/commitlog.cc index 2682db2fd5..e1a0a23bbe 100644 --- a/db/commitlog/commitlog.cc +++ b/db/commitlog/commitlog.cc @@ -1427,11 +1427,19 @@ future db::commitlog::segment_manager: ++_new_counter; - // don't increase reserve count if we are at max, or we would go over disk limit. - if (_reserve_segments.empty() && (_reserve_segments.max_size() < cfg.max_reserve_segments) && (totals.total_size_on_disk + max_size) <= max_disk_size) { - _reserve_segments.set_max_size(_reserve_segments.max_size() + 1); - clogger.debug("Increased segment reserve count to {}", _reserve_segments.max_size()); + if (_reserve_segments.empty()) { + // don't increase reserve count if we are at max, or we would go over disk limit. + if (_reserve_segments.max_size() < cfg.max_reserve_segments && (totals.total_size_on_disk + max_size) <= max_disk_size) { + _reserve_segments.set_max_size(_reserve_segments.max_size() + 1); + clogger.debug("Increased segment reserve count to {}", _reserve_segments.max_size()); + } + // if we have no reserve and we're above/at limits, make background task a little more eager. + if (!_shutdown && totals.total_size_on_disk >= disk_usage_threshold) { + _timer.cancel(); + _timer.arm(std::chrono::milliseconds(0)); + } } + return _reserve_segments.pop_eventually().then([this] (auto s) { _segments.push_back(std::move(s)); _segments.back()->reset_sync_time();