From: Patrick Steinhardt Date: Tue, 24 Feb 2026 08:45:44 GMT Subject: [PATCH v2 0/8] builtin/maintenance: use "geometric" strategy by default Message-ID: <20260224-b4-pks-maintenance-default-geometric-strategy-v2-0-8657338c6fa1@pks.im> In-Reply-To: <20260220-b4-pks-maintenance-default-geometric-strategy-v1-0-faeb321ad13b@pks.im> Hi, this series converts our default strategy used by git-maintenance(1) from "gc" to "geometric". The aim of this is twofold: - It completes the conversion to a more flexible infrastructure for repository maintenance. git-maintenance(1) is structured around tasks that can be toggled on/off as needed, and this is a lot easier to extend going forward. - We start to use a more efficient repacking strategy by default, which should especially help large repositories out there. Out of these two, I think that the first point is actually the more important one. Unfortunately, a lot of our tests are racy or will fail with the new strategy. This is mostly because the new strategy may decide to optimize data structures in cases where the old strategy didn't, and because the tasks we perform might be different. The majority of this patch series thus adapts our tests accordingly. The actual change is a one-line change in the final commit. I was a bit torn initially whether or not I want to make the geometric strategy the default right away, or whether we might first want to use "feature.experimental" as an additional step. I'm quite happy to adapt the series accordingly, but for the initial version I thought it might invite more discussions if I pick the nuclear option :) Of course, no matter how we do this, it is still possible to revert back to the old strategy by setting "maintenance.strategy=gc". Changes in v2: - Document the updated default strategy. - Clarify how this interacts with Scalar. - Explain the current landscape of strategies a bit better. - Leave some breadcrumbs in the tests. - Link to v1: https://lore.kernel.org/r/20260220-b4-pks-maintenance-default-geometric-strategy-v1-0-faeb321ad13b@pks.im Thanks! Patrick --- Patrick Steinhardt (8): t: fix races caused by background maintenance t: disable maintenance where we verify object database structure t34xx: don't expire reflogs where it matters t5400: explicitly use "gc" strategy t5510: explicitly use "gc" strategy t6500: explicitly use "gc" strategy t7900: prepare for switch of the default strategy builtin/maintenance: use "geometric" strategy by default Documentation/config/maintenance.adoc | 6 +++--- builtin/gc.c | 2 +- run-command.c | 2 +- t/t0081-find-pack.sh | 1 + t/t3404-rebase-interactive.sh | 6 ++++++ t/t3406-rebase-message.sh | 6 ++++++ t/t3431-rebase-fork-point.sh | 6 ++++++ t/t3432-rebase-fast-forward.sh | 6 ++++++ t/t5316-pack-delta-depth.sh | 1 + t/t5319-multi-pack-index.sh | 1 + t/t5326-multi-pack-bitmaps.sh | 3 ++- t/t5327-multi-pack-bitmaps-rev.sh | 3 ++- t/t5331-pack-objects-stdin.sh | 2 ++ t/t5332-multi-pack-reuse.sh | 1 + t/t5334-incremental-multi-pack-index.sh | 1 + t/t5400-send-pack.sh | 1 + t/t5500-fetch-pack.sh | 3 ++- t/t5510-fetch.sh | 1 + t/t5616-partial-clone.sh | 7 ++++--- t/t6500-gc.sh | 1 + t/t7700-repack.sh | 3 +++ t/t7900-maintenance.sh | 9 ++++++++- t/test-lib.sh | 4 ++++ 23 files changed, 64 insertions(+), 12 deletions(-) Range-diff versus v1: 1: c5fadf42d0 ! 1: 9efc6d0a22 t: fix races caused by background maintenance @@ Commit message background maintenance all over the place. Disabling maintenance outright in our test suite is not really an - option, as it would result in significantly divergence from the "real + option, as it would result in significant divergence from the "real world" and reduce our test coverage. But we've got an alternative up our sleeves: we can ensure that garbage collection runs synchronously by overriding the "maintenance.autoDetach" configuration. @@ Commit message slightly, but that may just as well be noise. Introduce a new `GIT_TEST_MAINT_AUTO_DETACH` environment variable that - allows us to override the auto-detach behaviour and set that varibale in + allows us to override the auto-detach behaviour and set that variable in our tests. Signed-off-by: Patrick Steinhardt @@ t/t5616-partial-clone.sh: test_expect_success 'fetch --refetch triggers repackin ## t/t7900-maintenance.sh ## @@ t/t7900-maintenance.sh: test_description='git maintenance builtin' - GIT_TEST_COMMIT_GRAPH=0 GIT_TEST_MULTI_PACK_INDEX=0 -+sane_unset GIT_TEST_MAINT_AUTO_DETACH ++# Ensure that auto-maintenance detaches as usual. ++sane_unset GIT_TEST_MAINT_AUTO_DETACH ++ test_lazy_prereq XMLLINT ' xmllint --version + ' ## t/test-lib.sh ## @@ t/test-lib.sh: test_lazy_prereq COMPAT_HASH ' 2: 805417a4a7 = 2: f80bde1353 t: disable maintenance where we verify object database structure 3: 8a579a768d ! 3: 7087a68815 t34xx: don't expire reflogs where it matters @@ t/t3404-rebase-interactive.sh: Initial setup: . "$TEST_DIRECTORY"/lib-rebase.sh test_expect_success 'setup' ' ++ # Commit dates are hardcoded to 2005, and the reflog entries will have ++ # a matching timestamp. Maintenance may thus immediately expire ++ # reflogs if it was running. + git config set gc.reflogExpire never && + git config set gc.reflogExpireUnreachable never && ++ git switch -C primary && test_commit A file1 && test_commit B file1 && @@ t/t3406-rebase-message.sh: export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME . ./test-lib.sh test_expect_success 'setup' ' ++ # Commit dates are hardcoded to 2005, and the reflog entries will have ++ # a matching timestamp. Maintenance may thus immediately expire ++ # reflogs if it was running. + git config set gc.reflogExpire never && + git config set gc.reflogExpireUnreachable never && + @@ t/t3431-rebase-fork-point.sh: export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME # C was formerly part of main but main was rewound to remove C # test_expect_success setup ' ++ # Commit dates are hardcoded to 2005, and the reflog entries will have ++ # a matching timestamp. Maintenance may thus immediately expire ++ # reflogs if it was running. + git config set gc.reflogExpire never && + git config set gc.reflogExpireUnreachable never && ++ test_commit A && test_commit B && test_commit C && @@ t/t3432-rebase-fast-forward.sh: export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME . ./test-lib.sh test_expect_success setup ' ++ # Commit dates are hardcoded to 2005, and the reflog entries will have ++ # a matching timestamp. Maintenance may thus immediately expire ++ # reflogs if it was running. + git config set gc.reflogExpire never && + git config set gc.reflogExpireUnreachable never && ++ test_commit A && test_commit B && test_commit C && 4: 283143c1d8 = 4: d230055b22 t5400: explicitly use "gc" strategy 5: 410dc16eb0 = 5: dba219391f t5510: explicitly use "gc" strategy 6: c4c8c5a7e4 = 6: 61bc1add2a t6500: explicitly use "gc" strategy 7: 93893cfee3 = 7: b89505178d t7900: prepare for switch of the default strategy 8: 9e7aa390a5 < -: ---------- builtin/maintenance: use "geometric" strategy by default -: ---------- > 8: 647d46a239 builtin/maintenance: use "geometric" strategy by default --- base-commit: 73fd77805fc6406f31c36212846d9e2541d19321 change-id: 20260218-b4-pks-maintenance-default-geometric-strategy-17fcedf92461