[Zodb-checkins] CVS: ZODB3/ZEO - ClientStorage.py:1.62

Guido van Rossum guido@python.org
Wed, 18 Sep 2002 23:51:23 -0400


Update of /cvs-repository/ZODB3/ZEO
In directory cvs.zope.org:/tmp/cvs-serv15377

Modified Files:
	ClientStorage.py 
Log Message:
The mystery of the Win98 hangs in the checkReconnectSwitch() test
until I added an is_connected() test to testConnection() is solved.

After the ConnectThread has switched the client to the new, read-write
connection, it closes the read-only connection(s) that it was saving
up in case there was no read-write connection.  But closing a
ManagedConnection calls notify_closed() on the manager, which
disconnected the manager and the client from its brand new read-write
connection.  The mistake here is that this should only be done when
closing the manager's current connection!

The fix was to add an argument to notify_closed() that passes the
connection object being closed; notify_closed() returns without doing
a thing when that is not the current connection.

I presume this didn't happen on Linux because there the sockets
happened to connect in a different order, and there was no read-only
connection to close yet (just a socket trying to connect).

I'm taking out the previous "fix" to ClientStorage, because that only
masked the problem in this relatively simple test case.  The problem
could still occur when both a read-only and a read-write server are up
initially, and the read-only server connects first; once the
read-write server connects, the read-write connection is installed,
and then the saved read-only connection is closed which would again
mistakenly disconnect the read-write connection.

Another (related) fix is not to call self.mgr.notify_closed() but to
call self.mgr.connection.close() when reconnecting.  (Hmm, I wonder if
it would make more sense to have an explicit reconnect callback to the
manager and the client?  Later.)


=== ZODB3/ZEO/ClientStorage.py 1.61 => 1.62 ===
--- ZODB3/ZEO/ClientStorage.py:1.61	Wed Sep 18 17:17:48 2002
+++ ZODB3/ZEO/ClientStorage.py	Wed Sep 18 23:51:22 2002
@@ -199,7 +199,7 @@
             stub.register(str(self._storage), self._is_read_only)
             return (stub, 1)
         except POSException.ReadOnlyError:
-            if not self._read_only_fallback or self.is_connected():
+            if not self._read_only_fallback:
                 raise
             log2(INFO, "Got ReadOnlyError; trying again with read_only=1")
             stub.register(str(self._storage), read_only=1)