зеркало из https://github.com/microsoft/git.git
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:
Родитель
a13e3d0ec8
Коммит
e841a79a13
|
@ -23,3 +23,12 @@ maintenance.loose-objects.auto::
|
||||||
positive value implies the command should run when the number of
|
positive value implies the command should run when the number of
|
||||||
loose objects is at least the value of `maintenance.loose-objects.auto`.
|
loose objects is at least the value of `maintenance.loose-objects.auto`.
|
||||||
The default value is 100.
|
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.
|
||||||
|
|
31
builtin/gc.c
31
builtin/gc.c
|
@ -30,6 +30,7 @@
|
||||||
#include "promisor-remote.h"
|
#include "promisor-remote.h"
|
||||||
#include "refs.h"
|
#include "refs.h"
|
||||||
#include "remote.h"
|
#include "remote.h"
|
||||||
|
#include "object-store.h"
|
||||||
|
|
||||||
#define FAILED_RUN "failed to run %s"
|
#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);
|
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)
|
static int multi_pack_index_write(struct maintenance_run_opts *opts)
|
||||||
{
|
{
|
||||||
struct child_process child = CHILD_PROCESS_INIT;
|
struct child_process child = CHILD_PROCESS_INIT;
|
||||||
|
@ -1156,6 +1186,7 @@ static struct maintenance_task tasks[] = {
|
||||||
[TASK_INCREMENTAL_REPACK] = {
|
[TASK_INCREMENTAL_REPACK] = {
|
||||||
"incremental-repack",
|
"incremental-repack",
|
||||||
maintenance_task_incremental_repack,
|
maintenance_task_incremental_repack,
|
||||||
|
incremental_repack_auto_condition,
|
||||||
},
|
},
|
||||||
[TASK_GC] = {
|
[TASK_GC] = {
|
||||||
"gc",
|
"gc",
|
||||||
|
|
|
@ -219,4 +219,32 @@ test_expect_success EXPENSIVE 'incremental-repack 2g limit' '
|
||||||
--no-progress --batch-size=2147483647 <run-2g.txt
|
--no-progress --batch-size=2147483647 <run-2g.txt
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'maintenance.incremental-repack.auto' '
|
||||||
|
git repack -adk &&
|
||||||
|
git config core.multiPackIndex true &&
|
||||||
|
git multi-pack-index write &&
|
||||||
|
GIT_TRACE2_EVENT="$(pwd)/midx-init.txt" git \
|
||||||
|
-c maintenance.incremental-repack.auto=1 \
|
||||||
|
maintenance run --auto --task=incremental-repack 2>/dev/null &&
|
||||||
|
test_subcommand ! git multi-pack-index write --no-progress <midx-init.txt &&
|
||||||
|
test_commit A &&
|
||||||
|
git pack-objects --revs .git/objects/pack/pack <<-\EOF &&
|
||||||
|
HEAD
|
||||||
|
^HEAD~1
|
||||||
|
EOF
|
||||||
|
GIT_TRACE2_EVENT=$(pwd)/trace-A git \
|
||||||
|
-c maintenance.incremental-repack.auto=2 \
|
||||||
|
maintenance run --auto --task=incremental-repack 2>/dev/null &&
|
||||||
|
test_subcommand ! git multi-pack-index write --no-progress <trace-A &&
|
||||||
|
test_commit B &&
|
||||||
|
git pack-objects --revs .git/objects/pack/pack <<-\EOF &&
|
||||||
|
HEAD
|
||||||
|
^HEAD~1
|
||||||
|
EOF
|
||||||
|
GIT_TRACE2_EVENT=$(pwd)/trace-B git \
|
||||||
|
-c maintenance.incremental-repack.auto=2 \
|
||||||
|
maintenance run --auto --task=incremental-repack 2>/dev/null &&
|
||||||
|
test_subcommand git multi-pack-index write --no-progress <trace-B
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
|
Загрузка…
Ссылка в новой задаче