[Neo-report] r2279 vincent - in /trunk/neo: client/ tests/client/

nobody at svn.erp5.org nobody at svn.erp5.org
Thu Sep 2 12:13:42 CEST 2010


Author: vincent
Date: Thu Sep  2 12:13:42 2010
New Revision: 2279

Log:
Make tpc_finish call tpc_vote when it hasn't been called yet.

This fixes random failures in old ZODB undo tests, where tpc_vote was not
called before tpc_finish/tpc_abort.

Modified:
    trunk/neo/client/Storage.py
    trunk/neo/client/app.py
    trunk/neo/tests/client/testClientApp.py

Modified: trunk/neo/client/Storage.py
==============================================================================
--- trunk/neo/client/Storage.py [iso-8859-1] (original)
+++ trunk/neo/client/Storage.py [iso-8859-1] Thu Sep  2 12:13:42 2010
@@ -66,7 +66,8 @@ class Storage(BaseStorage.BaseStorage,
         return self.app.tpc_abort(transaction=transaction)
 
     def tpc_finish(self, transaction, f=None):
-        return self.app.tpc_finish(transaction=transaction, f=f)
+        return self.app.tpc_finish(transaction=transaction,
+            tryToResolveConflict=self.tryToResolveConflict, f=f)
 
     @check_read_only
     def store(self, oid, serial, data, version, transaction):

Modified: trunk/neo/client/app.py
==============================================================================
--- trunk/neo/client/app.py [iso-8859-1] (original)
+++ trunk/neo/client/app.py [iso-8859-1] Thu Sep  2 12:13:42 2010
@@ -819,11 +819,13 @@ class Application(object):
         self.local_var.clear()
 
     @profiler_decorator
-    def tpc_finish(self, transaction, f=None):
+    def tpc_finish(self, transaction, tryToResolveConflict, f=None):
         """Finish current transaction."""
         if self.local_var.txn is not transaction:
             raise StorageTransactionError('tpc_finish called for wrong '
                 'transaction')
+        if not self.local_var.txn_voted:
+            self.tpc_vote(transaction, tryToResolveConflict)
         self._load_lock_acquire()
         try:
             tid = self.local_var.tid
@@ -1130,7 +1132,7 @@ class Application(object):
                 updateLastSerial(r.oid, result)
             updateLastSerial(None, self.tpc_vote(transaction,
                         tryToResolveConflict))
-            self.tpc_finish(transaction)
+            self.tpc_finish(transaction, tryToResolveConflict)
         transaction_iter.close()
 
     def iterator(self, start=None, stop=None):

Modified: trunk/neo/tests/client/testClientApp.py
==============================================================================
--- trunk/neo/tests/client/testClientApp.py [iso-8859-1] (original)
+++ trunk/neo/tests/client/testClientApp.py [iso-8859-1] Thu Sep  2 12:13:42 2010
@@ -149,7 +149,8 @@ class ClientApplicationTests(NeoTestBase
             'getAddress': ('127.0.0.1', 10010),
             'fakeReceived': packet,
         })
-        app.tpc_finish(txn)
+        app.local_var.txn_voted = True
+        app.tpc_finish(txn, None)
 
     # common checks
 
@@ -678,7 +679,7 @@ class ClientApplicationTests(NeoTestBase
         cell = Mock()
         app.pt = Mock({'getCellListForTID': (cell, cell)})
         app.cp = Mock({'getConnForCell': ReturnValues(None, cell)})
-        self.assertRaises(StorageTransactionError, app.tpc_finish, txn)
+        self.assertRaises(StorageTransactionError, app.tpc_finish, txn, None)
         # no packet sent
         self.checkNoPacketSent(conn)
         self.checkNoPacketSent(app.master_conn)
@@ -703,13 +704,32 @@ class ClientApplicationTests(NeoTestBase
             'getAddress': ('127.0.0.1', 10000),
             'fakeReceived': packet,
         })
+        self.vote_params = None
+        tpc_vote = app.tpc_vote
+        def voteDetector(transaction, tryToResolveConflict):
+            self.vote_params = (transaction, tryToResolveConflict)
+        dummy_tryToResolveConflict = []
+        app.tpc_vote = voteDetector
         app.dispatcher = Mock({})
+        app.local_var.txn_voted = True
         app.local_var.txn_finished = False
-        self.assertRaises(NEOStorageError, app.tpc_finish, txn, hook)
+        self.assertRaises(NEOStorageError, app.tpc_finish, txn,
+            dummy_tryToResolveConflict, hook)
         self.assertTrue(self.f_called)
         self.assertEquals(self.f_called_with_tid, tid)
+        self.assertEqual(self.vote_params, None)
         self.checkAskFinishTransaction(app.master_conn)
         self.checkDispatcherRegisterCalled(app, app.master_conn)
+        # Call again, but this time transaction is not voted yet
+        app.local_var.txn_voted = False
+        app.local_var.txn_finished = False
+        self.f_called = False
+        self.assertRaises(NEOStorageError, app.tpc_finish, txn,
+            dummy_tryToResolveConflict, hook)
+        self.assertTrue(self.f_called)
+        self.assertTrue(self.vote_params[0] is txn)
+        self.assertTrue(self.vote_params[1] is dummy_tryToResolveConflict)
+        app.tpc_vote = tpc_vote
 
     def test_tpc_finish3(self):
         # transaction is finished
@@ -730,8 +750,9 @@ class ClientApplicationTests(NeoTestBase
             'fakeReceived': packet,
         })
         app.dispatcher = Mock({})
+        app.local_var.txn_voted = True
         app.local_var.txn_finished = True
-        app.tpc_finish(txn, hook)
+        app.tpc_finish(txn, None, hook)
         self.assertTrue(self.f_called)
         self.assertEquals(self.f_called_with_tid, tid)
         self.checkAskFinishTransaction(app.master_conn)





More information about the Neo-report mailing list