reftable/stack: handle allocation failures in auto compaction

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>

Patrick Steinhardt committed Oct 2, 2024 at 12:56 UTC 5b67cc6477ce88c499caab5ebcebd492ec78932d
1 file changed +12 -4
reftable/stack.c
+12 -4
@@ -1518,6 +1518,8 @@ static uint64_t *stack_table_sizes_for_compaction(struct reftable_stack *st)
1518 uint64_t *sizes;
1519
1520 REFTABLE_CALLOC_ARRAY(sizes, st->merged->readers_len);
1521 + if (!sizes)
1522 + return NULL;
1523
1524 for (size_t i = 0; i < st->merged->readers_len; i++)
1525 sizes[i] = st->readers[i]->size - overhead;
@@ -1527,11 +1529,17 @@ static uint64_t *stack_table_sizes_for_compaction(struct reftable_stack *st)
1529
1530 int reftable_stack_auto_compact(struct reftable_stack *st)
1531 {
1530 - uint64_t *sizes = stack_table_sizes_for_compaction(st);
1531 - struct segment seg =
1532 - suggest_compaction_segment(sizes, st->merged->readers_len,
1533 - st->opts.auto_compaction_factor);
1532 + struct segment seg;
1533 + uint64_t *sizes;
1534 +
1535 + sizes = stack_table_sizes_for_compaction(st);
1536 + if (!sizes)
1537 + return REFTABLE_OUT_OF_MEMORY_ERROR;
1538 +
1539 + seg = suggest_compaction_segment(sizes, st->merged->readers_len,
1540 + st->opts.auto_compaction_factor);
1541 reftable_free(sizes);
1542 +
1543 if (segment_size(&seg) > 0)
1544 return stack_compact_range(st, seg.start, seg.end - 1,
1545 NULL, STACK_COMPACT_RANGE_BEST_EFFORT);