From eef16c096c803b405ba23307e55596d95e1892a7 Mon Sep 17 00:00:00 2001 From: Calle Wilund Date: Tue, 12 May 2026 10:15:24 +0200 Subject: [PATCH] db::commitlog: Add optional replay_position sieve to min_gc_time Allows filtering out timestamps by replay position (i.e. skip some segments) --- db/commitlog/commitlog.cc | 11 +++++++---- db/commitlog/commitlog.hh | 6 +++++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/db/commitlog/commitlog.cc b/db/commitlog/commitlog.cc index ee2155c0f0..8be025b261 100644 --- a/db/commitlog/commitlog.cc +++ b/db/commitlog/commitlog.cc @@ -488,7 +488,7 @@ public: future> list_descriptors(sstring dir) const; future> get_segments_to_replay() const; - gc_clock::time_point min_gc_time(const cf_id_type&) const; + gc_clock::time_point min_gc_time(const cf_id_type&, const db::replay_position&) const; flush_handler_id add_flush_handler(flush_handler h) { auto id = ++_flush_ids; @@ -2053,9 +2053,12 @@ future> db::commitlog::segment_manager::get_segments_to_rep co_return segments_to_replay; } -gc_clock::time_point db::commitlog::segment_manager::min_gc_time(const cf_id_type& id) const { +gc_clock::time_point db::commitlog::segment_manager::min_gc_time(const cf_id_type& id, const db::replay_position& rp) const { auto res = gc_clock::time_point::max(); for (auto& s : _segments) { + if (rp.valid() && replay_position(s->_desc.id, s->position()) <= rp) { + continue; + } res = std::min(res, s->min_time(id)); } return res; @@ -3956,8 +3959,8 @@ future> db::commitlog::list_existing_segments(const sstring }); } -gc_clock::time_point db::commitlog::min_gc_time(const cf_id_type& id) const { - return _segment_manager->min_gc_time(id); +gc_clock::time_point db::commitlog::min_gc_time(const cf_id_type& id, const db::replay_position& rp) const { + return _segment_manager->min_gc_time(id, rp); } db::replay_position db::commitlog::min_position() const { diff --git a/db/commitlog/commitlog.hh b/db/commitlog/commitlog.hh index 745c89bd4a..4cb76d11eb 100644 --- a/db/commitlog/commitlog.hh +++ b/db/commitlog/commitlog.hh @@ -375,7 +375,11 @@ public: future> list_existing_segments() const; future> list_existing_segments(const sstring& dir) const; - gc_clock::time_point min_gc_time(const cf_id_type&) const; + /** + * Gets the recorded min timestamp for the given id. Optionally filter by + * replay position, i.e. skip segments that have top position <= rp_filter + */ + gc_clock::time_point min_gc_time(const cf_id_type&, const db::replay_position& rp_filter = {}) const; // Return the lowest possible replay position across all existing or future commitlog segments. // In other words, only positions greater or equal to min_position() can