summaryrefslogtreecommitdiffstats
path: root/command.py
diff options
context:
space:
mode:
authorMike Frysinger <vapier@google.com>2021-02-16 01:45:39 -0500
committerMike Frysinger <vapier@google.com>2021-02-22 22:51:34 +0000
commit7c871163c8803e812998e5b2296e3bbb30b1367f (patch)
treebbd137a70f4237e1c7837f3daeb9e0844326b051 /command.py
parent6a2400a4d097b6e510dc9b8ec06283517b9ca3ad (diff)
downloadgit-repo-7c871163c8803e812998e5b2296e3bbb30b1367f.tar.gz
status: improve parallel execution stability
The status command runs a bunch of jobs in parallel, and each one is responsible for writing to stdout directly. When running many noisy jobs in parallel, output can get intermingled. Pass down a StringIO buffer for writing to so we can return the entire output as a string so the main job can handle displaying it. This fixes interleaved output as well as making the output stable: we always display results in the same project order now. By switching from map to imap, this ends up not really adding any overhead. Bug: https://crbug.com/gerrit/12231 Change-Id: Ic18b07c8074c046ff36e306eb8d392fb34fb6eca Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/297242 Tested-by: Mike Frysinger <vapier@google.com> Reviewed-by: Chris Mcdonald <cjmcdonald@google.com>
Diffstat (limited to 'command.py')
-rw-r--r--command.py9
1 files changed, 9 insertions, 0 deletions
diff --git a/command.py b/command.py
index 7737ec71..90bd0021 100644
--- a/command.py
+++ b/command.py
@@ -23,6 +23,15 @@ from error import NoSuchProjectError
23from error import InvalidProjectGroupsError 23from error import InvalidProjectGroupsError
24 24
25 25
26# Number of projects to submit to a single worker process at a time.
27# This number represents a tradeoff between the overhead of IPC and finer
28# grained opportunity for parallelism. This particular value was chosen by
29# iterating through powers of two until the overall performance no longer
30# improved. The performance of this batch size is not a function of the
31# number of cores on the system.
32WORKER_BATCH_SIZE = 32
33
34
26# How many jobs to run in parallel by default? This assumes the jobs are 35# How many jobs to run in parallel by default? This assumes the jobs are
27# largely I/O bound and do not hit the network. 36# largely I/O bound and do not hit the network.
28DEFAULT_LOCAL_JOBS = min(os.cpu_count(), 8) 37DEFAULT_LOCAL_JOBS = min(os.cpu_count(), 8)