sync: Refactor to use _RunOneGC and fix config leakage

Extract _RunOneGC to handle GC on a single project. This refactoring
makes it easier to invoke GC from parallel worker tasks.

Also, avoid modifying the passed-in config dictionary in _RunOneGC by
creating a local copy, preventing unintended side effects on other
commands sharing the same config.

Bug: 498290329
Change-Id: I7b77ed6629b14b5ee3322870b9c6c8ce2bfd6ea2
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/574923
Reviewed-by: Becky Siegel <beckysiegel@google.com>
Tested-by: Gavin Mak <gavinmak@google.com>
Commit-Queue: Gavin Mak <gavinmak@google.com>
This commit is contained in:
Gavin Mak
2026-04-20 17:57:20 +00:00
committed by gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com
parent 7e9079b7cf
commit baa281d99e
2 changed files with 42 additions and 26 deletions
+23 -8
View File
@@ -1244,14 +1244,15 @@ later is required to fix a server side protocol bug.
return False
def _SetPreciousObjectsState(self, project: Project, opt):
@classmethod
def _SetPreciousObjectsState(cls, project: Project, opt):
"""Correct the preciousObjects state for the project.
Args:
project: the project to examine, and possibly correct.
opt: options given to sync.
"""
expected = self._GetPreciousObjectsState(project, opt)
expected = cls._GetPreciousObjectsState(project, opt)
actual = (
project.config.GetBoolean("extensions.preciousObjects") or False
)
@@ -1285,7 +1286,22 @@ later is required to fix a server side protocol bug.
project.config.SetString("extensions.preciousObjects", None)
project.config.SetString("gc.pruneExpire", None)
def _GCProjects(self, projects, opt, err_event):
@staticmethod
def _RunOneGC(project: Project, config: Optional[dict] = None) -> None:
"""Run auto GC on a single project."""
local_config = {}
if config:
local_config.update(config)
local_config["gc.autoDetach"] = "false"
project.bare_git.gc("--auto", config=local_config)
@classmethod
def _GCProjects(
cls,
projects: List[Project],
opt: optparse.Values,
err_event: _threading.Event,
) -> None:
"""Perform garbage collection.
If We are skipping garbage collection (opt.auto_gc not set), we still
@@ -1295,7 +1311,7 @@ later is required to fix a server side protocol bug.
if not opt.auto_gc:
# Just repair preciousObjects state, and return.
for project in projects:
self._SetPreciousObjectsState(project, opt)
cls._SetPreciousObjectsState(project, opt)
return
pm = Progress(
@@ -1305,9 +1321,8 @@ later is required to fix a server side protocol bug.
tidy_dirs = {}
for project in projects:
self._SetPreciousObjectsState(project, opt)
cls._SetPreciousObjectsState(project, opt)
project.config.SetString("gc.autoDetach", "false")
# Only call git gc once per objdir, but call pack-refs for the
# remainder.
if project.objdir not in tidy_dirs:
@@ -1328,7 +1343,7 @@ later is required to fix a server side protocol bug.
pm.update(msg=bare_git._project.name)
if run_gc:
bare_git.gc("--auto")
cls._RunOneGC(bare_git._project)
else:
bare_git.pack_refs()
pm.end()
@@ -1345,7 +1360,7 @@ later is required to fix a server side protocol bug.
try:
try:
if run_gc:
bare_git.gc("--auto", config=config)
cls._RunOneGC(bare_git._project, config=config)
else:
bare_git.pack_refs(config=config)
except GitError: