[PATCH 7/9] reftable/stack: add function to check if optimization is required
- From
Karthik Nayak <karthik.188@gmail.com>
- Date
- Oct 10, 2025, 10:27 UTC
- Message-ID
- <20251010-562-add-option-to-check-if-reference-backend-needs-repacking-v1-7-c7962be584fa@gmail.com>
- In-Reply-To
- <20251010-562-add-option-to-check-if-reference-backend-needs-repacking-v1-0-c7962be584fa@gmail.com>
The reftable backend for references, performs auto-compaction as part of its regular flow. 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 | 3 +++ reftable/stack.c | 18 ++++++++++++++++++ t/unit-tests/u-reftable-stack.c | 12 ++++++++++-- 3 files changed, 31 insertions(+), 2 deletions(-)
diff --git a/reftable/reftable-stack.h b/reftable/reftable-stack.h index d70fcb705d..754e955206 100644 --- a/reftable/reftable-stack.h +++ b/reftable/reftable-stack.h @@ -123,6 +123,9 @@ struct reftable_log_expiry_config { int reftable_stack_compact_all(struct reftable_stack *st, struct reftable_log_expiry_config *config); +/* check if heuristic based compaction is required */ +int reftable_stack_compaction_required(struct reftable_stack *st, 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 9d9326ce0e..732141d46c 100644 --- a/reftable/stack.c +++ b/reftable/stack.c @@ -1652,6 +1652,24 @@ static int stack_segments_for_compaction(struct reftable_stack *st, return 0; } +int reftable_stack_compaction_required(struct reftable_stack *st, bool *required) +{ + struct segment seg; + int err = 0; + + if (st->merged->tables_len < 2) { + *required = false; + 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..80a87a15df 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, &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