mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
maintenance: create auto condition for loose-objects
The loose-objects task deletes loose objects that already exist in a pack-file, then place the remaining loose objects into a new pack-file. If this step runs all the time, then we risk creating pack-files with very few objects with every 'git commit' process. To prevent overwhelming the packs directory with small pack-files, place a minimum number of objects to justify the task. The 'maintenance.loose-objects.auto' config option specifies a minimum number of loose objects to justify the task to run under the '--auto' option. This defaults to 100 loose objects. Setting the value to zero will prevent the step from running under '--auto' while a negative value will force it to 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:
parent
252cfb7cb8
commit
3e220e6069
|
@ -14,3 +14,12 @@ maintenance.commit-graph.auto::
|
||||||
reachable commits that are not in the commit-graph file is at least
|
reachable commits that are not in the commit-graph file is at least
|
||||||
the value of `maintenance.commit-graph.auto`. The default value is
|
the value of `maintenance.commit-graph.auto`. The default value is
|
||||||
100.
|
100.
|
||||||
|
|
||||||
|
maintenance.loose-objects.auto::
|
||||||
|
This integer config option controls how often the `loose-objects` task
|
||||||
|
should be run as part of `git maintenance run --auto`. If zero, then
|
||||||
|
the `loose-objects` 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
|
||||||
|
loose objects is at least the value of `maintenance.loose-objects.auto`.
|
||||||
|
The default value is 100.
|
||||||
|
|
30
builtin/gc.c
30
builtin/gc.c
|
@ -899,6 +899,35 @@ struct write_loose_object_data {
|
||||||
int batch_size;
|
int batch_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int loose_object_auto_limit = 100;
|
||||||
|
|
||||||
|
static int loose_object_count(const struct object_id *oid,
|
||||||
|
const char *path,
|
||||||
|
void *data)
|
||||||
|
{
|
||||||
|
int *count = (int*)data;
|
||||||
|
if (++(*count) >= loose_object_auto_limit)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int loose_object_auto_condition(void)
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
git_config_get_int("maintenance.loose-objects.auto",
|
||||||
|
&loose_object_auto_limit);
|
||||||
|
|
||||||
|
if (!loose_object_auto_limit)
|
||||||
|
return 0;
|
||||||
|
if (loose_object_auto_limit < 0)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return for_each_loose_file_in_objdir(the_repository->objects->odb->path,
|
||||||
|
loose_object_count,
|
||||||
|
NULL, NULL, &count);
|
||||||
|
}
|
||||||
|
|
||||||
static int bail_on_loose(const struct object_id *oid,
|
static int bail_on_loose(const struct object_id *oid,
|
||||||
const char *path,
|
const char *path,
|
||||||
void *data)
|
void *data)
|
||||||
|
@ -1009,6 +1038,7 @@ static struct maintenance_task tasks[] = {
|
||||||
[TASK_LOOSE_OBJECTS] = {
|
[TASK_LOOSE_OBJECTS] = {
|
||||||
"loose-objects",
|
"loose-objects",
|
||||||
maintenance_task_loose_objects,
|
maintenance_task_loose_objects,
|
||||||
|
loose_object_auto_condition,
|
||||||
},
|
},
|
||||||
[TASK_GC] = {
|
[TASK_GC] = {
|
||||||
"gc",
|
"gc",
|
||||||
|
|
|
@ -127,4 +127,26 @@ test_expect_success 'loose-objects task' '
|
||||||
test_cmp packs-between packs-after
|
test_cmp packs-between packs-after
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'maintenance.loose-objects.auto' '
|
||||||
|
git repack -adk &&
|
||||||
|
GIT_TRACE2_EVENT="$(pwd)/trace-lo1.txt" \
|
||||||
|
git -c maintenance.loose-objects.auto=1 maintenance \
|
||||||
|
run --auto --task=loose-objects 2>/dev/null &&
|
||||||
|
test_subcommand ! git prune-packed --quiet <trace-lo1.txt &&
|
||||||
|
printf data-A | git hash-object -t blob --stdin -w &&
|
||||||
|
GIT_TRACE2_EVENT="$(pwd)/trace-loA" \
|
||||||
|
git -c maintenance.loose-objects.auto=2 \
|
||||||
|
maintenance run --auto --task=loose-objects 2>/dev/null &&
|
||||||
|
test_subcommand ! git prune-packed --quiet <trace-loA &&
|
||||||
|
printf data-B | git hash-object -t blob --stdin -w &&
|
||||||
|
GIT_TRACE2_EVENT="$(pwd)/trace-loB" \
|
||||||
|
git -c maintenance.loose-objects.auto=2 \
|
||||||
|
maintenance run --auto --task=loose-objects 2>/dev/null &&
|
||||||
|
test_subcommand git prune-packed --quiet <trace-loB &&
|
||||||
|
GIT_TRACE2_EVENT="$(pwd)/trace-loC" \
|
||||||
|
git -c maintenance.loose-objects.auto=2 \
|
||||||
|
maintenance run --auto --task=loose-objects 2>/dev/null &&
|
||||||
|
test_subcommand git prune-packed --quiet <trace-loC
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
|
Loading…
Reference in a new issue