]> git.ipfire.org Git - thirdparty/git.git/commitdiff
maintenance: create auto condition for loose-objects
authorDerrick Stolee <dstolee@microsoft.com>
Fri, 25 Sep 2020 12:33:33 +0000 (12:33 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 25 Sep 2020 17:53:04 +0000 (10:53 -0700)
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>
Documentation/config/maintenance.txt
builtin/gc.c
t/t7900-maintenance.sh

index 7cc6700d574d3208178d7d36e00d62f71d5b10bf..c31613be628e0112ced8fa302e8fe765d0c02c51 100644 (file)
@@ -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.
index c9db8555b9965b7cf9154f9f40af024d8bef374d..4403827481592417af431dc99f5cd4735dc28b9e 100644 (file)
@@ -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",
index b3fc7c8670147967b41d08047af478c45aa0415c..27565c55a2b3b9506320467c4698aef417dac5a5 100755 (executable)
@@ -127,4 +127,26 @@ test_expect_success 'loose-objects task' '
        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