[Zodb-checkins] CVS: StandaloneZODB/ZEO - smac.py:1.10.2.1

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


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

Modified Files:
      Tag: zeo-1_0-branch
	smac.py 
Log Message:
Wrap send() and recv() calls in try/except

The try/except catches errors like EAGAIN that indicate transient
failures.  In those cases, treat as send() and recv() of no data and
return from method gracefully.


=== StandaloneZODB/ZEO/smac.py 1.10 => 1.10.2.1 ===
 
 import asyncore, string, struct, zLOG, sys, Acquisition
+import socket, errno
 from zLOG import LOG, TRACE, ERROR, INFO
 
+# Use the dictionary to make sure we get the minimum number of errno
+# entries.   We expect that EWOULDBLOCK == EAGAIN on most systems --
+# or that only one is actually used.
+
+tmp_dict = {errno.EWOULDBLOCK: 0,
+            errno.EAGAIN: 0,
+            errno.EINTR: 0,
+            }
+expected_socket_read_errors = tuple(tmp_dict.keys())
+
+tmp_dict = {errno.EAGAIN: 0,
+            errno.EWOULDBLOCK: 0,
+            errno.ENOBUFS: 0,
+            errno.EINTR: 0,
+            }
+expected_socket_write_errors = tuple(tmp_dict.keys())
+del tmp_dict
+
 class SizedMessageAsyncConnection(Acquisition.Explicit, asyncore.dispatcher):
 
     __append=None # Marker indicating that we're closed
@@ -116,7 +135,12 @@
                     join=string.join, StringType=type(''), _type=type,
                     _None=None):
 
-        d=self.recv(8096)
+        try:
+            d=self.recv(8096)
+        except socket.error, err:
+            if err[0] in expected_socket_read_errors:
+                return
+            raise
         if not d: return
 
         inp=self.__inp
@@ -160,7 +184,12 @@
         output=self.__output
         while output:
             v=output[0]
-            n=self.send(v)
+            try:
+                n=self.send(v)
+            except socket.error, err:
+                if err[0] in expected_socket_write_errors:
+                    break # we couldn't write anything
+                raise
             if n < len(v):
                 output[0]=v[n:]
                 break # we can't write any more