[Zodb-checkins] SVN: ZODB/trunk/src/ Bug fixed:

Jim Fulton jim at zope.com
Tue Aug 25 07:01:46 EDT 2009


Log message for revision 103190:
  Bug fixed:
    Certain ZEO server errors could cause a client to get into a state
    where it couldn't commit transactions.
    https://bugs.launchpad.net/zodb/+bug/374737
  

Changed:
  U   ZODB/trunk/src/CHANGES.txt
  U   ZODB/trunk/src/ZEO/StorageServer.py

-=-
Modified: ZODB/trunk/src/CHANGES.txt
===================================================================
--- ZODB/trunk/src/CHANGES.txt	2009-08-25 09:01:56 UTC (rev 103189)
+++ ZODB/trunk/src/CHANGES.txt	2009-08-25 11:01:46 UTC (rev 103190)
@@ -41,6 +41,10 @@
   Changed its sort parameter list to match that of its (Python 2.4+)
   UserList base class.
 
+- Certain ZEO server errors could cause a client to get into a state
+  where it couldn't commit transactions.
+  https://bugs.launchpad.net/zodb/+bug/374737
+
 3.9.0b5 (2009-08-06)
 ====================
 

Modified: ZODB/trunk/src/ZEO/StorageServer.py
===================================================================
--- ZODB/trunk/src/ZEO/StorageServer.py	2009-08-25 09:01:56 UTC (rev 103189)
+++ ZODB/trunk/src/ZEO/StorageServer.py	2009-08-25 11:01:46 UTC (rev 103190)
@@ -407,7 +407,7 @@
                 raise StorageTransactionError("Multiple simultaneous tpc_begin"
                                               " requests from one client.")
 
-        self.transaction = t = transaction.Transaction()
+        t = transaction.Transaction()
         t.id = id
         t.user = user
         t.description = description
@@ -421,6 +421,16 @@
         self.store_failed = 0
         self.stats.active_txns += 1
 
+        # Assign the transaction attribute last. This is so we don't
+        # think we've entered TPC until everything is set.  Why?
+        # Because if we have an error after this, the server will
+        # think it is in TPC and the client will think it isn't.  At
+        # that point, the client will keep trying to enter TPC and
+        # server won't let it.  Errors *after* the tpc_begin call will
+        # cause the client to abort the transaction.
+        # (Also see https://bugs.launchpad.net/zodb/+bug/374737.)
+        self.transaction = t
+
     def tpc_finish(self, id):
         if not self._check_tid(id):
             return



More information about the Zodb-checkins mailing list