aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarthik Nayak <karthik.188@gmail.com>2025-11-06 09:22:30 +0100
committerJunio C Hamano <gitster@pobox.com>2025-11-06 10:00:07 -0800
commit4463808fd7d3d96bf77fa738bfb8beba3c9129f7 (patch)
tree97258afea604fa28bcd93fb3a11bd40b2155dd8b
parentMerge branch 'kn/refs-optim-cleanup' into kn/maintenance-is-needed (diff)
downloadgit-4463808fd7d3d96bf77fa738bfb8beba3c9129f7.tar.gz
git-4463808fd7d3d96bf77fa738bfb8beba3c9129f7.zip
reftable/stack: return stack segments directly
The `stack_table_sizes_for_compaction()` function returns individual sizes of each reftable table. This function is only called by `reftable_stack_auto_compact()` to decide which tables need to be compacted, if any. Modify the function to directly return the segments, which avoids the extra step of receiving the sizes only to pass it to `suggest_compaction_segment()`. A future commit will also add functionality for checking whether auto-compaction is necessary without performing it. This change allows code re-usability in that context. Signed-off-by: Karthik Nayak <karthik.188@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--reftable/stack.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/reftable/stack.c b/reftable/stack.c
index 65d89820bd..49387f9344 100644
--- a/reftable/stack.c
+++ b/reftable/stack.c
@@ -1626,7 +1626,8 @@ struct segment suggest_compaction_segment(uint64_t *sizes, size_t n,
return seg;
}
-static uint64_t *stack_table_sizes_for_compaction(struct reftable_stack *st)
+static int stack_segments_for_compaction(struct reftable_stack *st,
+ struct segment *seg)
{
int version = (st->opts.hash_id == REFTABLE_HASH_SHA1) ? 1 : 2;
int overhead = header_size(version) - 1;
@@ -1634,29 +1635,29 @@ static uint64_t *stack_table_sizes_for_compaction(struct reftable_stack *st)
REFTABLE_CALLOC_ARRAY(sizes, st->merged->tables_len);
if (!sizes)
- return NULL;
+ return REFTABLE_OUT_OF_MEMORY_ERROR;
for (size_t i = 0; i < st->merged->tables_len; i++)
sizes[i] = st->tables[i]->size - overhead;
- return sizes;
+ *seg = suggest_compaction_segment(sizes, st->merged->tables_len,
+ st->opts.auto_compaction_factor);
+ reftable_free(sizes);
+
+ return 0;
}
int reftable_stack_auto_compact(struct reftable_stack *st)
{
struct segment seg;
- uint64_t *sizes;
+ int err;
if (st->merged->tables_len < 2)
return 0;
- sizes = stack_table_sizes_for_compaction(st);
- if (!sizes)
- return REFTABLE_OUT_OF_MEMORY_ERROR;
-
- seg = suggest_compaction_segment(sizes, st->merged->tables_len,
- st->opts.auto_compaction_factor);
- reftable_free(sizes);
+ err = stack_segments_for_compaction(st, &seg);
+ if (err)
+ return err;
if (segment_size(&seg) > 0)
return stack_compact_range(st, seg.start, seg.end - 1,