[Python-Dev] issue17097:baseManager serve_client() not check EINTR when recv request

Royce Lv lvroyce at linux.vnet.ibm.com
Fri Feb 1 11:58:35 CET 2013


Hi All,

We create our customised manager which will fork child process with baseManager. Because we registered SIGCHLD to reap the zombie for manager, we found this causes baseManager raise RemoteError when called twice.(Test script attached.)

After look at baseManager.py we found recv() in handling the request has been interrupted by comming SIGCHLD, not retry recv(), but raise to client side directly.
             try:

                 methodname = obj = None

                 request = recv()<------------------this line been interrupted by SIGCHLD

                 ident, methodname, args, kwds = request

                 obj, exposed, gettypeid = id_to_obj[ident]

                 if methodname not in exposed:

                     raise AttributeError(

                         'method %r of %r object is not in exposed=%r' %

                         (methodname, type(obj), exposed)

                         )

                 function = getattr(obj, methodname)
                 try:

                     res = function(*args, **kwds)

                 except Exception, e:

                     msg = ('#ERROR', e)

                 else:

                     typeid = gettypeid and gettypeid.get(methodname, None)

                     if typeid:

                         rident, rexposed = self.create(conn, typeid, res)

                         token = Token(typeid, self.address, rident)

                         msg = ('#PROXY', (rexposed, token))

                     else:

                         msg = ('#RETURN', res)
             except AttributeError:
                 if methodname is None:
                     msg = ('#TRACEBACK', format_exc())
                 else:
                     try:
                         fallback_func = self.fallback_mapping[methodname]
                         result = fallback_func(
                             self, conn, ident, obj, *args, **kwds
                             )
                         msg = ('#RETURN', result)
                     except Exception:
                         msg = ('#TRACEBACK', format_exc())

             except EOFError:
                 util.debug('got EOF -- exiting thread serving %r',
                            threading.current_thread().name)
                 sys.exit(0)

             except Exception:<------does not handle IOError,INTR here should retry recv()
                 msg = ('#TRACEBACK', format_exc())


REF: http://bugs.python.org/issue17097


-------------- next part --------------
A non-text attachment was scrubbed...
Name: fakesupervdsm.py
Type: text/x-python
Size: 1571 bytes
Desc: not available
URL: <http://mail.python.org/pipermail/python-dev/attachments/20130201/62411f68/attachment.py>


More information about the Python-Dev mailing list