diff options
Diffstat (limited to 'geo-replication/syncdaemon/repce.py')
| -rw-r--r-- | geo-replication/syncdaemon/repce.py | 52 | 
1 files changed, 37 insertions, 15 deletions
diff --git a/geo-replication/syncdaemon/repce.py b/geo-replication/syncdaemon/repce.py index 755fb61df48..d7b17dda796 100644 --- a/geo-replication/syncdaemon/repce.py +++ b/geo-replication/syncdaemon/repce.py @@ -1,3 +1,13 @@ +# +# Copyright (c) 2011-2014 Red Hat, Inc. <http://www.redhat.com> +# This file is part of GlusterFS. + +# This file is licensed to you under your choice of the GNU Lesser +# General Public License, version 3 or any later version (LGPLv3 or +# later), or the GNU General Public License, version 2 (GPLv2), in all +# cases as published by the Free Software Foundation. +# +  import os  import sys  import time @@ -24,6 +34,7 @@ from syncdutils import Thread, select  pickle_proto = -1  repce_version = 1.0 +  def ioparse(i, o):      if isinstance(i, int):          i = os.fdopen(i) @@ -34,6 +45,7 @@ def ioparse(i, o):          o = o.fileno()      return (i, o) +  def send(out, *args):      """pickle args and write out wholly in one syscall @@ -43,12 +55,14 @@ def send(out, *args):      """      os.write(out, pickle.dumps(args, pickle_proto)) +  def recv(inf):      """load an object from input stream"""      return pickle.load(inf)  class RepceServer(object): +      """RePCe is Hungarian for canola, http://hu.wikipedia.org/wiki/Repce      ... also our homebrewed RPC backend where the transport layer is @@ -95,16 +109,17 @@ class RepceServer(object):              if rmeth == '__repce_version__':                  res = repce_version              else: -              try: -                  res = getattr(self.obj, rmeth)(*in_data[2:]) -              except: -                  res = sys.exc_info()[1] -                  exc = True -                  logging.exception("call failed: ") +                try: +                    res = getattr(self.obj, rmeth)(*in_data[2:]) +                except: +                    res = sys.exc_info()[1] +                    exc = True +                    logging.exception("call failed: ")              send(self.out, rid, exc, res)  class RepceJob(object): +      """class representing message status we can use      for waiting on reply""" @@ -137,6 +152,7 @@ class RepceJob(object):  class RepceClient(object): +      """RePCe is Hungarian for canola, http://hu.wikipedia.org/wiki/Repce      ... also our homebrewed RPC backend where the transport layer is @@ -148,7 +164,7 @@ class RepceClient(object):      def __init__(self, i, o):          self.inf, self.out = ioparse(i, o)          self.jtab = {} -        t = Thread(target = self.listen) +        t = Thread(target=self.listen)          t.start()      def listen(self): @@ -177,25 +193,31 @@ class RepceClient(object):          return rjob      def __call__(self, meth, *args): -        """RePCe client is callabe, calling it implements a synchronous remote call +        """RePCe client is callabe, calling it implements a synchronous +        remote call. -        We do a .push with a cbk which does a wakeup upon receiving anwser, then wait -        on the RepceJob. +        We do a .push with a cbk which does a wakeup upon receiving anwser, +        then wait on the RepceJob.          """ -        rjob = self.push(meth, *args, **{'cbk': lambda rj, res: rj.wakeup(res)}) +        rjob = self.push( +            meth, *args, **{'cbk': lambda rj, res: rj.wakeup(res)})          exc, res = rjob.wait()          if exc: -            logging.error('call %s (%s) failed on peer with %s' % (repr(rjob), meth, str(type(res).__name__))) +            logging.error('call %s (%s) failed on peer with %s' % +                          (repr(rjob), meth, str(type(res).__name__)))              raise res          logging.debug("call %s %s -> %s" % (repr(rjob), meth, repr(res)))          return res      class mprx(object): -        """method proxy, standard trick to implement rubyesque method_missing -           in Python -        A class is a closure factory, you know what I mean, or go read some SICP. +        """method proxy, standard trick to implement rubyesque +        method_missing in Python + +        A class is a closure factory, you know what I mean, or go read +        some SICP.          """ +          def __init__(self, ins, meth):              self.ins = ins              self.meth = meth  | 
