summaryrefslogtreecommitdiffstats
path: root/subcmds/abandon.py
diff options
context:
space:
mode:
authorKuang-che Wu <kcwu@google.com>2024-10-22 21:04:41 +0800
committerLUCI <gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com>2024-10-23 23:34:34 +0000
commit8da4861b3860c505e39341b4135c21f67569e4d8 (patch)
tree6f300266c91322df0e61953b84381e1f403074a5 /subcmds/abandon.py
parent39ffd9977e2f6cb1ca1757e59173fc93e0eab72c (diff)
downloadgit-repo-8da4861b3860c505e39341b4135c21f67569e4d8.tar.gz
subcmds: reduce multiprocessing serialization overhead
Follow the same approach as 39ffd9977e to reduce serialization overhead. Below benchmarks are tested with 2.7k projects on my workstation (warm cache). git tracing is disabled for benchmark. (seconds) | v2.48 | v2.48 | this CL | this CL | | -j32 | | -j32 ----------------------------------------------------------- with clean tree state: branches (none) | 5.6 | 5.9 | 1.0 | 0.9 status (clean) | 21.3 | 9.4 | 19.4 | 4.7 diff (none) | 7.6 | 7.2 | 5.7 | 2.2 prune (none) | 5.7 | 6.1 | 1.3 | 1.2 abandon (none) | 19.4 | 18.6 | 0.9 | 0.8 upload (none) | 19.7 | 18.7 | 0.9 | 0.8 forall -c true | 7.5 | 7.6 | 0.6 | 0.6 forall -c "git log -1" | 11.3 | 11.1 | 0.6 | 0.6 with branches: start BRANCH --all | 21.9 | 20.3 | 13.6 | 2.6 checkout BRANCH | 29.1 | 27.8 | 1.1 | 1.0 branches (2) | 28.0 | 28.6 | 1.5 | 1.3 abandon BRANCH | 29.2 | 27.5 | 9.7 | 2.2 Bug: b/371638995 Change-Id: I53989a3d1e43063587b3f52f852b1c2c56b49412 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/440221 Reviewed-by: Josip Sokcevic <sokcevic@google.com> Tested-by: Kuang-che Wu <kcwu@google.com> Commit-Queue: Kuang-che Wu <kcwu@google.com>
Diffstat (limited to 'subcmds/abandon.py')
-rw-r--r--subcmds/abandon.py30
1 files changed, 18 insertions, 12 deletions
diff --git a/subcmds/abandon.py b/subcmds/abandon.py
index e280d69e..3208be6b 100644
--- a/subcmds/abandon.py
+++ b/subcmds/abandon.py
@@ -70,8 +70,10 @@ It is equivalent to "git branch -D <branchname>".
70 else: 70 else:
71 args.insert(0, "'All local branches'") 71 args.insert(0, "'All local branches'")
72 72
73 def _ExecuteOne(self, all_branches, nb, project): 73 @classmethod
74 def _ExecuteOne(cls, all_branches, nb, project_idx):
74 """Abandon one project.""" 75 """Abandon one project."""
76 project = cls.get_parallel_context()["projects"][project_idx]
75 if all_branches: 77 if all_branches:
76 branches = project.GetBranches() 78 branches = project.GetBranches()
77 else: 79 else:
@@ -89,7 +91,7 @@ It is equivalent to "git branch -D <branchname>".
89 if status is not None: 91 if status is not None:
90 ret[name] = status 92 ret[name] = status
91 93
92 return (ret, project, errors) 94 return (ret, project_idx, errors)
93 95
94 def Execute(self, opt, args): 96 def Execute(self, opt, args):
95 nb = args[0].split() 97 nb = args[0].split()
@@ -102,7 +104,8 @@ It is equivalent to "git branch -D <branchname>".
102 _RelPath = lambda p: p.RelPath(local=opt.this_manifest_only) 104 _RelPath = lambda p: p.RelPath(local=opt.this_manifest_only)
103 105
104 def _ProcessResults(_pool, pm, states): 106 def _ProcessResults(_pool, pm, states):
105 for results, project, errors in states: 107 for results, project_idx, errors in states:
108 project = all_projects[project_idx]
106 for branch, status in results.items(): 109 for branch, status in results.items():
107 if status: 110 if status:
108 success[branch].append(project) 111 success[branch].append(project)
@@ -111,15 +114,18 @@ It is equivalent to "git branch -D <branchname>".
111 aggregate_errors.extend(errors) 114 aggregate_errors.extend(errors)
112 pm.update(msg="") 115 pm.update(msg="")
113 116
114 self.ExecuteInParallel( 117 with self.ParallelContext():
115 opt.jobs, 118 self.get_parallel_context()["projects"] = all_projects
116 functools.partial(self._ExecuteOne, opt.all, nb), 119 self.ExecuteInParallel(
117 all_projects, 120 opt.jobs,
118 callback=_ProcessResults, 121 functools.partial(self._ExecuteOne, opt.all, nb),
119 output=Progress( 122 range(len(all_projects)),
120 f"Abandon {nb}", len(all_projects), quiet=opt.quiet 123 callback=_ProcessResults,
121 ), 124 output=Progress(
122 ) 125 f"Abandon {nb}", len(all_projects), quiet=opt.quiet
126 ),
127 chunksize=1,
128 )
123 129
124 width = max( 130 width = max(
125 itertools.chain( 131 itertools.chain(