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>
Derrick Stolee committedSep 25, 2020 at 12:33 UTC3e220e60696ebc27c719b83adc6f734d6857521f
3 files changed+61
Documentation/config/maintenance.txt
+9
index 7cc6700d57..c31613be62 100644--- a/Documentation/config/maintenance.txt+++ b/Documentation/config/maintenance.txt@@ -14,3 +14,12 @@ maintenance.commit-graph.auto:: reachable commits that are not in the commit-graph file is at least the value of `maintenance.commit-graph.auto`. The default value is 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.
builtin/gc.c
+30
index c9db8555b9..4403827481 100644--- a/builtin/gc.c+++ b/builtin/gc.c@@ -899,6 +899,35 @@ struct write_loose_object_data { 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, const char *path, void *data)@@ -1009,6 +1038,7 @@ static struct maintenance_task tasks[] = { [TASK_LOOSE_OBJECTS] = { "loose-objects", maintenance_task_loose_objects,+ loose_object_auto_condition, }, [TASK_GC] = { "gc",