createrepo/__init__.py
[email protected] Thu, 13 Sep 2012 12:03:36 +0000 (UTC)
| Newsgroups | gmane.linux.rpm.metadata |
|---|---|
| Message-ID | <[email protected]> |
--===============7139806552581294210== Content-Type: text/plain createrepo/__init__.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) New commits: commit 71cd4c45a84366ae66eb1b6e619f1b3987249c2d Author: Zdeněk Pavlas <[email protected]> Date: Wed Sep 12 12:36:49 2012 +0200 Fix the deadlock issue. BZ 856363 select() on all workers, process their output. Exit loop when all pipes have been closed. diff --git a/createrepo/__init__.py b/createrepo/__init__.py index d2e2039..e132257 100644 --- a/createrepo/__init__.py +++ b/createrepo/__init__.py @@ -26,6 +26,7 @@ import tempfile import stat import fcntl import subprocess +from select import select from yum import misc, Errors from yum.repoMDObject import RepoMD, RepoData @@ -650,6 +651,7 @@ class MetaDataGenerator: + fds = {} for (num, cmdline) in worker_cmd_dict.items(): if not self.conf.quiet: self.callback.log("Spawning worker %s with %s pkgs" % (num, @@ -657,22 +659,20 @@ class MetaDataGenerator: job = subprocess.Popen(cmdline, stdout=subprocess.PIPE, stderr=subprocess.PIPE) worker_jobs[num] = job + fds[job.stdout.fileno()] = num, job.stdout, self.callback.log + fds[job.stderr.fileno()] = num, job.stderr, self.callback.errorlog - gimmebreak = 0 - while gimmebreak != len(worker_jobs.keys()): - gimmebreak = 0 - for (num,job) in worker_jobs.items(): - if job.poll() is not None: - gimmebreak+=1 - line = job.stdout.readline() - if line: - self.callback.log('Worker %s: %s' % (num, line.rstrip())) - line = job.stderr.readline() - if line: - self.callback.errorlog('Worker %s: %s' % (num, line.rstrip())) - + while fds: + for fd in select(fds, [], [])[0]: + num, stream, logger = fds[fd] + line = stream.readline() + if line == '': + del fds[fd] + continue + logger('Worker %s: %s' % (num, line.rstrip())) + for (num, job) in worker_jobs.items(): - if job.returncode != 0: + if job.wait() != 0: msg = "Worker exited with non-zero value: %s. Fatal." % job.returncode self.callback.errorlog(msg) raise MDError, msg --===============7139806552581294210== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Rpm-metadata mailing list [email protected] http://lists.baseurl.org/mailman/listinfo/rpm-metadata --===============7139806552581294210==--