diff options
| author | Mike Frysinger <vapier@google.com> | 2021-02-16 01:45:39 -0500 |
|---|---|---|
| committer | Mike Frysinger <vapier@google.com> | 2021-02-22 22:51:34 +0000 |
| commit | 7c871163c8803e812998e5b2296e3bbb30b1367f (patch) | |
| tree | bbd137a70f4237e1c7837f3daeb9e0844326b051 /command.py | |
| parent | 6a2400a4d097b6e510dc9b8ec06283517b9ca3ad (diff) | |
| download | git-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.py | 9 |
1 files changed, 9 insertions, 0 deletions
| @@ -23,6 +23,15 @@ from error import NoSuchProjectError | |||
| 23 | from error import InvalidProjectGroupsError | 23 | from 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. | ||
| 32 | WORKER_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. |
| 28 | DEFAULT_LOCAL_JOBS = min(os.cpu_count(), 8) | 37 | DEFAULT_LOCAL_JOBS = min(os.cpu_count(), 8) |
