[Zodb-checkins] SVN: ZODB/trunk/src/ZEO/tests/ConnectionTests.py checkTimeoutProvokingConflicts: try to fix rare failures.

Tim Peters tim.one at comcast.net
Mon Mar 28 17:10:43 EST 2005


Log message for revision 29710:
  checkTimeoutProvokingConflicts:  try to fix rare failures.
  
  This always slept for 3 seconds, waiting for the storage to
  disconnect.  This loses on two counts:
  
  1. Since the timeout is set to 1 second, it typically sleeps
     longer than necessary.
  
  2. Since there's no predicting thread and process scheduling,
     3 seconds isn't always long enough, and rare failures have
     been reported against this test.
  
  Instead we do a polling loop now.  This typically succeeds in
  a little more than a second, speeding the normal case.  The
  loop will continue trying for up to a minute if not.
  

Changed:
  U   ZODB/trunk/src/ZEO/tests/ConnectionTests.py

-=-
Modified: ZODB/trunk/src/ZEO/tests/ConnectionTests.py
===================================================================
--- ZODB/trunk/src/ZEO/tests/ConnectionTests.py	2005-03-28 20:56:54 UTC (rev 29709)
+++ ZODB/trunk/src/ZEO/tests/ConnectionTests.py	2005-03-28 22:10:43 UTC (rev 29710)
@@ -986,10 +986,10 @@
     def checkTimeoutProvokingConflicts(self):
         eq = self.assertEqual
         raises = self.assertRaises
-        unless = self.failUnless
+        require = self.assert_
         self._storage = storage = self.openClientStorage()
-        # Assert that the zeo cache is empty
-        unless(not list(storage._cache.contents()))
+        # Assert that the zeo cache is empty.
+        require(not list(storage._cache.contents()))
         # Create the object
         oid = storage.new_oid()
         obj = MinPO(7)
@@ -1001,20 +1001,32 @@
         revid1b = storage.tpc_vote(t)
         revid1 = handle_serials(oid, revid1a, revid1b)
         storage.tpc_finish(t)
-        # Now do a store, sleeping before the finish so as to cause a timeout
+        # Now do a store, sleeping before the finish so as to cause a timeout.
         obj.value = 8
         t = Transaction()
         storage.tpc_begin(t)
         revid2a = storage.store(oid, revid1, zodb_pickle(obj), '', t)
         revid2b = storage.tpc_vote(t)
         revid2 = handle_serials(oid, revid2a, revid2b)
-        # Now sleep long enough for the storage to time out
-        time.sleep(3)
+
+        # Now sleep long enough for the storage to time out.
+        # This used to sleep for 3 seconds, and sometimes (but very rarely)
+        # failed then.  Now we try for a minute.  It typically succeeds
+        # on the second time thru the loop, and, since self.timeout is 1,
+        # it's typically faster now (2/1.8 ~= 1.11 seconds sleeping instead
+        # of 3).
+        deadline = time.time() + 60 # wait up to a minute
+        while time.time() < deadline:
+            if storage.is_connected():
+                time.sleep(self.timeout / 1.8)
+                storage.sync()
+            else:
+                break
         storage.sync()
-        unless(not storage.is_connected())
+        require(not storage.is_connected())
         storage._wait()
-        unless(storage.is_connected())
-        # We expect finish to fail
+        require(storage.is_connected())
+        # We expect finish to fail.
         raises(ClientDisconnected, storage.tpc_finish, t)
         # Now we think we've committed the second transaction, but we really
         # haven't.  A third one should produce a POSKeyError on the server,
@@ -1024,20 +1036,20 @@
         storage.tpc_begin(t)
         storage.store(oid, revid2, zodb_pickle(obj), '', t)
         raises(ConflictError, storage.tpc_vote, t)
-        # Even aborting won't help
+        # Even aborting won't help.
         storage.tpc_abort(t)
         storage.tpc_finish(t)
-        # Try again
+        # Try again.
         obj.value = 10
         t = Transaction()
         storage.tpc_begin(t)
         storage.store(oid, revid2, zodb_pickle(obj), '', t)
-        # Even aborting won't help
+        # Even aborting won't help.
         raises(ConflictError, storage.tpc_vote, t)
-        # Abort this one and try a transaction that should succeed
+        # Abort this one and try a transaction that should succeed.
         storage.tpc_abort(t)
         storage.tpc_finish(t)
-        # Now do a store, sleeping before the finish so as to cause a timeout
+        # Now do a store.
         obj.value = 11
         t = Transaction()
         storage.tpc_begin(t)
@@ -1045,7 +1057,7 @@
         revid2b = storage.tpc_vote(t)
         revid2 = handle_serials(oid, revid2a, revid2b)
         storage.tpc_finish(t)
-        # Now load the object and verify that it has a value of 11
+        # Now load the object and verify that it has a value of 11.
         data, revid = storage.load(oid, '')
         eq(zodb_unpickle(data), MinPO(11))
         eq(revid, revid2)



More information about the Zodb-checkins mailing list