[PATCH STABLE] worker: wait worker pid explicitly
Yuya Nishihara
yuya at tcha.org
Sat Jul 23 10:39:54 EDT 2016
On Fri, 22 Jul 2016 20:50:48 +0100, Jun Wu wrote:
> # HG changeset patch
> # User Jun Wu <quark at fb.com>
> # Date 1469216267 -3600
> # Fri Jul 22 20:37:47 2016 +0100
> # Node ID 74d799c4781183b539aedd93530f0e5fa06839cc
> # Parent d3df009ab1175a6792549b51ae66486dd98f398b
> # Available At https://bitbucket.org/quark-zju/hg-draft
> # hg pull https://bitbucket.org/quark-zju/hg-draft -r 74d799c47811
> worker: wait worker pid explicitly
>
> Before this patch, waitforworkers uses os.wait() to collect child workers, and
> only wait len(pids) processes. This can have serious issues if other code
> spawns new processes and does not reap them: 1. worker.py may get wrong exit
> code and kill innocent workers. 2. worker.py may continue without waiting for
> all workers to complete.
>
> This patch fixes the issue by using waitpid to wait worker pid explicitly.
>
> diff --git a/mercurial/worker.py b/mercurial/worker.py
> --- a/mercurial/worker.py
> +++ b/mercurial/worker.py
> @@ -112,8 +112,8 @@ def _posixworker(ui, func, staticargs, a
> if err.errno != errno.ESRCH:
> raise
> def waitforworkers():
> - for _pid in pids:
> - st = _exitstatus(os.wait()[1])
> + for pid in pids:
> + st = _exitstatus(os.waitpid(pid, 0)[1])
New implementation can't detect failures ASAP, which is what 9955fc5ee24b
tried to solve.
https://selenic.com/repo/hg/rev/9955fc5ee24b
Somewhat related, maybe we can handle this issue by worker-to-master pipe?
https://bz.mercurial-scm.org/show_bug.cgi?id=4929#c9
More information about the Mercurial-devel
mailing list