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)  | 
