maintenance: add incremental-repack auto condition
The incremental-repack task updates the multi-pack-index by deleting pack-
files that have been replaced with new packs, then repacking a batch of
small pack-files into a larger pack-file. This incremental repack is faster
than rewriting all object data, but is slower than some other
maintenance activities.
The 'maintenance.incremental-repack.auto' config option specifies how many
pack-files should exist outside of the multi-pack-index before running
the step. These pack-files could be created by 'git fetch' commands or
by the loose-objects task. The default value is 10.
Setting the option to zero disables the task with the '--auto' option,
and a negative value makes the task run every time.
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Derrick Stolee committedSep 25, 2020 at 12:33 UTCe841a79a131d8ce491cf04d0ca3e24f139a10b82
3 files changed+68
Documentation/config/maintenance.txt
+9
index c31613be62..a0706d8f09 100644--- a/Documentation/config/maintenance.txt+++ b/Documentation/config/maintenance.txt@@ -23,3 +23,12 @@ maintenance.loose-objects.auto:: positive value implies the command should run when the number of loose objects is at least the value of `maintenance.loose-objects.auto`. The default value is 100.++maintenance.incremental-repack.auto::+ This integer config option controls how often the `incremental-repack`+ task should be run as part of `git maintenance run --auto`. If zero,+ then the `incremental-repack` task will not run with the `--auto`+ option. A negative value will force the task to run every time.+ Otherwise, a positive value implies the command should run when the+ number of pack-files not in the multi-pack-index is at least the value+ of `maintenance.incremental-repack.auto`. The default value is 10.
builtin/gc.c
+31
index 8d22361fa9..2b99596ec8 100644--- a/builtin/gc.c+++ b/builtin/gc.c@@ -30,6 +30,7 @@ #include "promisor-remote.h" #include "refs.h" #include "remote.h"+#include "object-store.h" #define FAILED_RUN "failed to run %s"@@ -1001,6 +1002,35 @@ static int maintenance_task_loose_objects(struct maintenance_run_opts *opts) return prune_packed(opts) || pack_loose(opts); }+static int incremental_repack_auto_condition(void)+{+ struct packed_git *p;+ int enabled;+ int incremental_repack_auto_limit = 10;+ int count = 0;++ if (git_config_get_bool("core.multiPackIndex", &enabled) ||+ !enabled)+ return 0;++ git_config_get_int("maintenance.incremental-repack.auto",+ &incremental_repack_auto_limit);++ if (!incremental_repack_auto_limit)+ return 0;+ if (incremental_repack_auto_limit < 0)+ return 1;++ for (p = get_packed_git(the_repository);+ count < incremental_repack_auto_limit && p;+ p = p->next) {+ if (!p->multi_pack_index)+ count++;+ }++ return count >= incremental_repack_auto_limit;+}+ static int multi_pack_index_write(struct maintenance_run_opts *opts) { struct child_process child = CHILD_PROCESS_INIT;@@ -1156,6 +1186,7 @@ static struct maintenance_task tasks[] = { [TASK_INCREMENTAL_REPACK] = { "incremental-repack", maintenance_task_incremental_repack,+ incremental_repack_auto_condition, }, [TASK_GC] = { "gc",