Discussion:
createrepo/__init__.py
z***@osuosl.org
2012-09-13 12:03:36 UTC
Permalink
createrepo/__init__.py | 28 ++++++++++++++--------------
1 file changed, 14 insertions(+), 14 deletions(-)

New commits:
commit 71cd4c45a84366ae66eb1b6e619f1b3987249c2d
Author: Zdeněk Pavlas <***@redhat.com>
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

Loading...