mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
reftable/stack: add function to check if optimization is required
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. Extract out the heuristics logic from 'reftable_stack_auto_compact()' into an internal function 'update_segment_if_compaction_required()'. Then use this to 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> Acked-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
135f491f83
commit
e35155588a
@@ -123,6 +123,17 @@ struct reftable_log_expiry_config {
|
|||||||
int reftable_stack_compact_all(struct reftable_stack *st,
|
int reftable_stack_compact_all(struct reftable_stack *st,
|
||||||
struct reftable_log_expiry_config *config);
|
struct reftable_log_expiry_config *config);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check if compaction is required.
|
||||||
|
*
|
||||||
|
* When `use_heuristics` is false, check if all tables can be compacted to a
|
||||||
|
* single table. If true, use heuristics to determine if the tables need to be
|
||||||
|
* compacted to maintain geometric progression.
|
||||||
|
*/
|
||||||
|
int reftable_stack_compaction_required(struct reftable_stack *st,
|
||||||
|
bool use_heuristics,
|
||||||
|
bool *required);
|
||||||
|
|
||||||
/* heuristically compact unbalanced table stack. */
|
/* heuristically compact unbalanced table stack. */
|
||||||
int reftable_stack_auto_compact(struct reftable_stack *st);
|
int reftable_stack_auto_compact(struct reftable_stack *st);
|
||||||
|
|
||||||
|
|||||||
@@ -1647,19 +1647,51 @@ static int stack_segments_for_compaction(struct reftable_stack *st,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int reftable_stack_auto_compact(struct reftable_stack *st)
|
static int update_segment_if_compaction_required(struct reftable_stack *st,
|
||||||
|
struct segment *seg,
|
||||||
|
bool use_geometric,
|
||||||
|
bool *required)
|
||||||
{
|
{
|
||||||
struct segment seg;
|
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (st->merged->tables_len < 2)
|
if (st->merged->tables_len < 2) {
|
||||||
|
*required = false;
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
err = stack_segments_for_compaction(st, &seg);
|
if (!use_geometric) {
|
||||||
|
*required = true;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = stack_segments_for_compaction(st, seg);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
if (segment_size(&seg) > 0)
|
*required = segment_size(seg) > 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int reftable_stack_compaction_required(struct reftable_stack *st,
|
||||||
|
bool use_heuristics,
|
||||||
|
bool *required)
|
||||||
|
{
|
||||||
|
struct segment seg;
|
||||||
|
return update_segment_if_compaction_required(st, &seg, use_heuristics,
|
||||||
|
required);
|
||||||
|
}
|
||||||
|
|
||||||
|
int reftable_stack_auto_compact(struct reftable_stack *st)
|
||||||
|
{
|
||||||
|
struct segment seg;
|
||||||
|
bool required;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = update_segment_if_compaction_required(st, &seg, true, &required);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
if (required)
|
||||||
return stack_compact_range(st, seg.start, seg.end - 1,
|
return stack_compact_range(st, seg.start, seg.end - 1,
|
||||||
NULL, STACK_COMPACT_RANGE_BEST_EFFORT);
|
NULL, STACK_COMPACT_RANGE_BEST_EFFORT);
|
||||||
|
|
||||||
|
|||||||
@@ -1067,6 +1067,7 @@ void test_reftable_stack__add_performs_auto_compaction(void)
|
|||||||
.value_type = REFTABLE_REF_SYMREF,
|
.value_type = REFTABLE_REF_SYMREF,
|
||||||
.value.symref = (char *) "master",
|
.value.symref = (char *) "master",
|
||||||
};
|
};
|
||||||
|
bool required = false;
|
||||||
char buf[128];
|
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
|
* auto compaction is disabled. When enabled, we should merge
|
||||||
* all tables in the stack.
|
* 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);
|
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_i(st->merged->tables_len, 1);
|
||||||
|
cl_assert_equal_b(required, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
reftable_stack_destroy(st);
|
reftable_stack_destroy(st);
|
||||||
|
|||||||
Reference in New Issue
Block a user