[Zodb-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 Zodb-checkins
mailing list