From ad36d5b7349c7ff784116b12f5dada24121728df Mon Sep 17 00:00:00 2001 From: Csaba Henk Date: Fri, 20 Apr 2012 17:21:12 +0200 Subject: geo-rep / gsyncd: fixes regarding the command invocation framework Some of the bugs to fix were found by the following stress-test: make "glusterfs --client-pid=-1" exit immediately on slave side. Also fix eintr_wrap which should not "adopt" exceptions generated by the wrapped call, by re-raising them as GsyncdError. Change-Id: Ia0d39e0635975ebbbf98d86e1e26f3122e1ed6ff BUG: 764678 Signed-off-by: Csaba Henk Reviewed-on: http://review.gluster.com/3258 Tested-by: Gluster Build System Reviewed-by: Venky Shankar --- .../features/marker/utils/syncdaemon/resource.py | 32 ++++++++++++++++------ 1 file changed, 24 insertions(+), 8 deletions(-) (limited to 'xlators/features/marker/utils/syncdaemon/resource.py') diff --git a/xlators/features/marker/utils/syncdaemon/resource.py b/xlators/features/marker/utils/syncdaemon/resource.py index c850e1fe313..923cf78d4cd 100644 --- a/xlators/features/marker/utils/syncdaemon/resource.py +++ b/xlators/features/marker/utils/syncdaemon/resource.py @@ -11,6 +11,7 @@ import tempfile import threading import subprocess from errno import EEXIST, ENOENT, ENODATA, ENOTDIR, ELOOP, EISDIR +from select import error as selecterror from gconf import gconf import repce @@ -116,18 +117,32 @@ class Popen(subprocess.Popen): cls.errstore = {} def tailer(): while True: - for po in select([po.stderr for po in cls.errstore], [], []): + errstore = cls.errstore.copy() + try: + poe, _ ,_ = select([po.stderr for po in errstore], [], [], 1) + except ValueError, selecterror: + continue + for po in errstore: + if po.stderr not in poe: + next po.lock.acquire() try: - la = cls.errstore.get(po) + la = errstore.get(po) if la == None: continue - l = os.read(po.stderr.fileno(), 1024) + try: + fd = po.stderr.fileno() + except ValueError: # file is already closed + continue + l = os.read(fd, 1024) + if not l: + continue tots = len(l) for lx in la: tots += len(lx) while tots > 1<<20 and la: tots -= len(la.pop(0)) + la.append(l) finally: po.lock.release() t = syncdutils.Thread(target = tailer) @@ -159,11 +174,11 @@ class Popen(subprocess.Popen): def errfail(self): """fail nicely if child did not terminate with success""" - filling = None + filling = "" if self.elines: filling = ", saying:" - logging.error("""command "%s" returned with %d%s""" % \ - (" ".join(self.args), self.returncode, filling)) + logging.error("""command "%s" returned with %s%s""" % \ + (" ".join(self.args), repr(self.returncode), filling)) for l in self.elines: for ll in l.rstrip().split("\n"): logging.error(self.args[0] + "> " + ll.rstrip()) @@ -181,9 +196,10 @@ class Popen(subprocess.Popen): self.lock.release() if self.poll() == None: self.terminate() - if sp.poll() == None: + if self.poll() == None: time.sleep(0.1) - sp.kill() + self.kill() + self.wait() while True: b = os.read(self.stderr.fileno(), 1024) if b: -- cgit