[PATCH 2/5] reftable/stack: add function to check if optimization is required
- From
Karthik Nayak <karthik.188@gmail.com>
- Date
- Oct 31, 2025, 14:22 UTC
- Message-ID
- <20251031-562-add-sub-command-to-check-if-maintenance-is-needed-v1-2-a03d53e28d0e@gmail.com>
- In-Reply-To
- <20251031-562-add-sub-command-to-check-if-maintenance-is-needed-v1-0-a03d53e28d0e@gmail.com>
The reftable backend, performs auto-compaction as part of its regular flow, which is required to keep the number of tables part of a stack at bay. This allows it to stay optimized.
Compaction can also be triggered voluntarily by the user via the 'git pack-refs' or the 'git refs optimize' command. However, currently there is no way for the user to check if optimization is required without actually performing it.
Add and expose `reftable_stack_compaction_required()` which will allow users to check if the reftable backend can be optimized.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com> --- reftable/reftable-stack.h | 5 +++++ reftable/stack.c | 25 +++++++++++++++++++++++++ t/unit-tests/u-reftable-stack.c | 12 ++++++++++-- 3 files changed, 40 insertions(+), 2 deletions(-)
diff --git a/reftable/reftable-stack.h b/reftable/reftable-stack.h index d70fcb705d..a875149439 100644 --- a/reftable/reftable-stack.h +++ b/reftable/reftable-stack.h @@ -123,6 +123,11 @@ struct reftable_log_expiry_config { int reftable_stack_compact_all(struct reftable_stack *st, struct reftable_log_expiry_config *config); +/* Check if compaction is required. */ +int reftable_stack_compaction_required(struct reftable_stack *st, + bool use_heuristics, + bool *required); + /* heuristically compact unbalanced table stack. */ int reftable_stack_auto_compact(struct reftable_stack *st); diff --git a/reftable/stack.c b/reftable/stack.c index 49387f9344..18fa41cd5c 100644 --- a/reftable/stack.c +++ b/reftable/stack.c @@ -1647,6 +1647,31 @@ static int stack_segments_for_compaction(struct reftable_stack *st, return 0; } +int reftable_stack_compaction_required(struct reftable_stack *st, + bool use_heuristics, + bool *required) +{ + struct segment seg; + int err = 0; + + if (st->merged->tables_len < 2) { + *required = false; + return 0; + } + + if (!use_heuristics) { + *required = true; + return 0; + } + + err = stack_segments_for_compaction(st, &seg); + if (err) + return err; + + *required = segment_size(&seg) > 0; + return 0; +} + int reftable_stack_auto_compact(struct reftable_stack *st) { struct segment seg; diff --git a/t/unit-tests/u-reftable-stack.c b/t/unit-tests/u-reftable-stack.c index a8b91812e8..b8110cdeee 100644 --- a/t/unit-tests/u-reftable-stack.c +++ b/t/unit-tests/u-reftable-stack.c @@ -1067,6 +1067,7 @@ void test_reftable_stack__add_performs_auto_compaction(void) .value_type = REFTABLE_REF_SYMREF, .value.symref = (char *) "master", }; + bool required = false; char buf[128]; /* @@ -1087,10 +1088,17 @@ void test_reftable_stack__add_performs_auto_compaction(void) * auto compaction is disabled. When enabled, we should merge * all tables in the stack. */ - if (i != n) + cl_assert_equal_i(reftable_stack_compaction_required(st, true, &required), 0); + if (i != n) { cl_assert_equal_i(st->merged->tables_len, i + 1); - else + if (i < 1) + cl_assert_equal_b(required, false); + else + cl_assert_equal_b(required, true); + } else { cl_assert_equal_i(st->merged->tables_len, 1); + cl_assert_equal_b(required, false); + } } reftable_stack_destroy(st);
-- 2.51.0