[Zodb-checkins] CVS: StandaloneZODB/ZEO - asyncwrap.py: StorageServer.py: zrpc.py:

Jeremy Hylton jeremy@zope.com
Wed, 22 Aug 2001 17:04:42 -0400

Update of /cvs-repository/StandaloneZODB/ZEO
In directory cvs.zope.org:/tmp/cvs-serv19352

Modified Files:
      Tag: zeo-1_0-branch
	StorageServer.py zrpc.py 
Added Files:
      Tag: zeo-1_0-branch
Log Message:
Use asyncwrap to call asyncore.loop() and asyncore.poll()

=== Added File StandaloneZODB/ZEO/asyncwrap.py ===
"""A wrapper for asyncore that provides robust exception handling.

The poll() and loop() calls exported by asyncore can raise exceptions.
asyncore uses either the select() or poll() system call.  It is
possible for those system calls to fail, returning, for example,
EINTR.  Python raises a select.error when an error occurs.  If the
program using asyncore doesn't catch the exception, it will die with
an uncaught exception.

This module exports safer versions of loop() and poll() that wrap the
asyncore calls in try/except handlers that catch the errors and do the
right thing.  In most cases, it is safe to catch the error and simply
retry the call.

XXX Operations on asyncore sockets can also fail with exceptions that
can safely be caught and ignored by user programs.  It's not clear if
it would be useful to extend this module with wrappers for those

# XXX The current implementation requires Python 2.0.  Not sure if
# that's acceptable, depends on how many users want to combine ZEO 1.0
# and Zope 2.3.

import asyncore
import errno
import select

def loop(*args, **kwargs):
    while 1:
            apply(asyncore.loop, args, kwargs)
        except select.error, err:
            if err[0] != errno.EINTR:
def poll(*args, **kwargs):
        apply(asyncore.poll, args, kwargs)
    except select.error, err:
        if err[0] != errno.EINTR:

=== StandaloneZODB/ZEO/StorageServer.py => ===
 from cStringIO import StringIO
 from ZEO import trigger
+from ZEO import asyncwrap
 class StorageServerError(POSException.StorageError): pass
@@ -184,8 +185,8 @@
             sock, addr = self.accept()
         except socket.error:
             sys.stderr.write('warning: accept failed\n')
-        ZEOConnection(self, sock, addr)
+        else:
+            ZEOConnection(self, sock, addr)
     def log_info(self, message, type='info'):
         if type=='error': type=ERROR
@@ -577,7 +578,10 @@
     import ZODB.FileStorage
     name, port = sys.argv[1:3]
     blather(name, port)
-    try: port='',string.atoi(port)
-    except: pass
+    try:
+        port='', int(port)
+    except:
+        pass
     StorageServer(port, ZODB.FileStorage.FileStorage(name))
-    asyncore.loop()
+    asyncwrap.loop()

=== StandaloneZODB/ZEO/zrpc.py => ===
 from smac import SizedMessageAsyncConnection
 import socket, string, struct, asyncore, sys, time, select
 from zLOG import LOG, TRACE, DEBUG, INFO
+from ZEO import asyncwrap
 from errno import EINTR
 # We create a special fast pickler! This allows us
 # to create slightly more efficient pickles and
@@ -186,13 +187,13 @@
             try: r, w, e = select.select([self._fileno],[],[],0.0)
             except select.error, v:
                 if v[0] != EINTR: raise
-            if r: asyncore.poll(0.0, self)
+            if r: asyncwrap.poll(0.0, self)
             else: break
     def readLoop(self):
         while not la(0):
-            asyncore.poll(60.0, self)
+            asyncwrap.poll(60.0, self)
     def setLoop(self, map=None, Wakeup=lambda : None):
@@ -242,7 +243,7 @@
         if self.__haveMainLoop:
             self.__Wakeup() # Wake up the main loop
-        else: asyncore.poll(0.0, self)
+        else: asyncwrap.poll(0.0, self)
     def setOutOfBand(self, f):
         """Define a call-back function for handling out-of-band communication