diff options
author | Csaba Henk <csaba@redhat.com> | 2012-04-20 17:21:12 +0200 |
---|---|---|
committer | Vijay Bellur <vijay@gluster.com> | 2012-05-19 06:11:45 -0700 |
commit | ad36d5b7349c7ff784116b12f5dada24121728df (patch) | |
tree | 7e1fe68d996ff1e3986ebaed89f20d4fafdd067c | |
parent | 7e6ee8afd7b36988c0f95bc6e1ba94a39d8ca30a (diff) |
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 <csaba@redhat.com>
Reviewed-on: http://review.gluster.com/3258
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Venky Shankar <vshankar@redhat.com>
-rw-r--r-- | xlators/features/marker/utils/syncdaemon/resource.py | 32 | ||||
-rw-r--r-- | xlators/features/marker/utils/syncdaemon/syncdutils.py | 2 |
2 files changed, 25 insertions, 9 deletions
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: diff --git a/xlators/features/marker/utils/syncdaemon/syncdutils.py b/xlators/features/marker/utils/syncdaemon/syncdutils.py index 1a7dbd4dbbe..b29936d596d 100644 --- a/xlators/features/marker/utils/syncdaemon/syncdutils.py +++ b/xlators/features/marker/utils/syncdaemon/syncdutils.py @@ -264,7 +264,7 @@ def eintr_wrap(func, exc, *a): except exc: ex = sys.exc_info()[1] if not ex.args[0] == EINTR: - raise GsyncdError(ex.args[1]) + raise def select(*a): return eintr_wrap(oselect.select, oselect.error, *a) |