[Checkins] SVN: ZODB/branches/3.9/src/ZEO/ Bug fix: the ConnectionManager could hang if its ConnectThread died

Jim Fulton jim at zope.com
Mon Sep 20 15:27:07 EDT 2010


Log message for revision 116682:
  Bug fix: the ConnectionManager could hang if its ConnectThread died
  without setting the connection.
  

Changed:
  U   ZODB/branches/3.9/src/ZEO/tests/testZEO.py
  U   ZODB/branches/3.9/src/ZEO/zrpc/client.py

-=-
Modified: ZODB/branches/3.9/src/ZEO/tests/testZEO.py
===================================================================
--- ZODB/branches/3.9/src/ZEO/tests/testZEO.py	2010-09-20 19:22:06 UTC (rev 116681)
+++ ZODB/branches/3.9/src/ZEO/tests/testZEO.py	2010-09-20 19:27:07 UTC (rev 116682)
@@ -1326,7 +1326,33 @@
     >>> db.close()
 
     """
+def sync_connect_doesnt_hang():
+    r"""
+    >>> import threading
+    >>> import ZEO.zrpc.client
+    >>> ConnectThread = ZEO.zrpc.client.ConnectThread
+    >>> ZEO.zrpc.client.ConnectThread = lambda *a, **kw: threading.Thread()
 
+    >>> class CM(ZEO.zrpc.client.ConnectionManager):
+    ...     sync_wait = 1
+    ...     _start_asyncore_loop = lambda self: None
+    >>> cm = CM('', object())
+
+    Calling connect results in an exception being raised, instead of hanging
+    indefinitely when the thread dies without setting up the connection.
+
+    >>> cm.connect(sync=1)
+    Traceback (most recent call last):
+    ...
+    AssertionError
+
+    >>> cm.thread.isAlive()
+    False
+    >>> ZEO.zrpc.client.ConnectThread = ConnectThread
+
+    """
+
+
 slow_test_classes = [
     BlobAdaptedFileStorageTests, BlobWritableCacheTests,
     DemoStorageTests, FileStorageTests, MappingStorageTests,
@@ -1341,7 +1367,7 @@
 
     class StorageServerStubClass(ZEO.ServerStub.StorageServer):
 
-        # Wait for abort for the benefit of blob_transacton.txt
+        # Wait for abort for the benefit of blob_transaction.txt
         def tpc_abort(self, id):
             self.rpc.call('tpc_abort', id)
 

Modified: ZODB/branches/3.9/src/ZEO/zrpc/client.py
===================================================================
--- ZODB/branches/3.9/src/ZEO/zrpc/client.py	2010-09-20 19:22:06 UTC (rev 116681)
+++ ZODB/branches/3.9/src/ZEO/zrpc/client.py	2010-09-20 19:27:07 UTC (rev 116682)
@@ -29,6 +29,8 @@
 class ConnectionManager(object):
     """Keeps a connection up over time"""
 
+    sync_wait = 30
+
     def __init__(self, addrs, client, tmin=1, tmax=180):
         start_client_thread()
         self.addrlist = self._parse_addrs(addrs)
@@ -148,14 +150,13 @@
                 t.setDaemon(1)
                 t.start()
             if sync:
-                while self.connection is None:
-                    self.cond.wait(30)
+                while self.connection is None and t.isAlive():
+                    self.cond.wait(self.sync_wait)
                     if self.connection is None:
                         log("CM.connect(sync=1): still waiting...")
+                assert self.connection is not None
         finally:
             self.cond.release()
-        if sync:
-            assert self.connection is not None
 
     def connect_done(self, conn, preferred):
         # Called by ConnectWrapper.notify_client() after notifying the client



More information about the checkins mailing list