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>
This commit is contained in:

committed by
Junio C Hamano

parent
a13e3d0ec8
commit
e841a79a13
31
builtin/gc.c
31
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",
|
||||
|
Reference in New Issue
Block a user