]> git.ipfire.org Git - thirdparty/git.git/commitdiff
reftable/stack: handle allocation failures in auto compaction
authorPatrick Steinhardt <ps@pks.im>
Wed, 2 Oct 2024 10:56:11 +0000 (12:56 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 2 Oct 2024 14:53:54 +0000 (07:53 -0700)
Handle allocation failures in `reftable_stack_auto_compact()`.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
reftable/stack.c

index 2e6dd513d72fd33325fa02a76dd675f48b33ffa8..990784d9d2fe76f31cd72b770b8317e9ab484231 100644 (file)
@@ -1518,6 +1518,8 @@ static uint64_t *stack_table_sizes_for_compaction(struct reftable_stack *st)
        uint64_t *sizes;
 
        REFTABLE_CALLOC_ARRAY(sizes, st->merged->readers_len);
+       if (!sizes)
+               return NULL;
 
        for (size_t i = 0; i < st->merged->readers_len; i++)
                sizes[i] = st->readers[i]->size - overhead;
@@ -1527,11 +1529,17 @@ static uint64_t *stack_table_sizes_for_compaction(struct reftable_stack *st)
 
 int reftable_stack_auto_compact(struct reftable_stack *st)
 {
-       uint64_t *sizes = stack_table_sizes_for_compaction(st);
-       struct segment seg =
-               suggest_compaction_segment(sizes, st->merged->readers_len,
-                                          st->opts.auto_compaction_factor);
+       struct segment seg;
+       uint64_t *sizes;
+
+       sizes = stack_table_sizes_for_compaction(st);
+       if (!sizes)
+               return REFTABLE_OUT_OF_MEMORY_ERROR;
+
+       seg = suggest_compaction_segment(sizes, st->merged->readers_len,
+                                        st->opts.auto_compaction_factor);
        reftable_free(sizes);
+
        if (segment_size(&seg) > 0)
                return stack_compact_range(st, seg.start, seg.end - 1,
                                           NULL, STACK_COMPACT_RANGE_BEST_EFFORT);