Skip to content

Commit f89356d

Browse files
pks-tgitster
authored andcommitted
refs/reftable: expose auto compaction via new flag
Under normal circumstances, the "reftable" backend will automatically perform compaction after appending to the stack. It is thus not necessary and may even be considered wasteful to run git-pack-refs(1) in "reftable"-backed repositories as it will cause the backend to compact all tables into a single one. We do exactly that though when running `git maintenance run --auto` or `git gc --auto`, which gets spawned by Git after running some specific commands. The `--auto` mode is typically only executing optimizations as needed. To do so, we already use several heuristics for the various different data structures in Git to determine whether to optimize them or not. We do not use any heuristics for refs though and instead always optimize them. Introduce a new `PACK_REFS_AUTO` flag that can be passed to the backend. When not handled by the backend we will continue to behave the exact same as we do right now, that is we optimize refs unconditionally. This is done for the "files" backend for now to retain current behaviour, even though we may eventually also want to introduce heuristics here. For the "reftable" backend though we already do have auto-compaction, so we can easily reuse that logic to implement the new auto-packing flag. Note that under normal circumstances, this should always end up being a no-op. After all, we already invoke the code for every single addition to the stack. But there are special cases where it can still be helpful to execute the auto-compaction code explicitly: - Concurrent writers may cause compaction to not run due to locks. - Callers may decide to disable compaction altogether and then pack refs at a later point due to various reasons. - Other implementations of the reftable format may do compaction differently or even not at all. Signed-off-by: Patrick Steinhardt <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 35aeabd commit f89356d

File tree

2 files changed

+9
-2
lines changed

2 files changed

+9
-2
lines changed

refs.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -422,8 +422,12 @@ void warn_dangling_symrefs(FILE *fp, const char *msg_fmt,
422422
/*
423423
* Flags for controlling behaviour of pack_refs()
424424
* PACK_REFS_PRUNE: Prune loose refs after packing
425+
* PACK_REFS_AUTO: Pack refs on a best effort basis. The heuristics and end
426+
* result are decided by the ref backend. Backends may ignore
427+
* this flag and fall back to a normal repack.
425428
*/
426-
#define PACK_REFS_PRUNE 0x0001
429+
#define PACK_REFS_PRUNE (1 << 0)
430+
#define PACK_REFS_AUTO (1 << 1)
427431

428432
struct pack_refs_opts {
429433
unsigned int flags;

refs/reftable-backend.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1220,7 +1220,10 @@ static int reftable_be_pack_refs(struct ref_store *ref_store,
12201220
if (!stack)
12211221
stack = refs->main_stack;
12221222

1223-
ret = reftable_stack_compact_all(stack, NULL);
1223+
if (opts->flags & PACK_REFS_AUTO)
1224+
ret = reftable_stack_auto_compact(stack);
1225+
else
1226+
ret = reftable_stack_compact_all(stack, NULL);
12241227
if (ret < 0) {
12251228
ret = error(_("unable to compact stack: %s"),
12261229
reftable_error_str(ret));

0 commit comments

Comments
 (0)