[Zodb-checkins] CVS: ZODB/src/ZODB/tests - PackableStorage.py:1.32

Tim Peters tim.one at comcast.net
Thu Mar 11 22:11:35 EST 2004


Update of /cvs-repository/ZODB/src/ZODB/tests
In directory cvs.zope.org:/tmp/cvs-serv31008/src/ZODB/tests

Modified Files:
	PackableStorage.py 
Log Message:
Print a lot more stuff when one of the pack-while-writing tests fails with
an unexpectedly live thread at the end.  That's been happening forever,
but never when I stare at it, and the more I stare at those tests the more
baffled I am that it ever fails this way.  So the point here is to get
more clues when nobody is staring at it <wink>.


=== ZODB/src/ZODB/tests/PackableStorage.py 1.31 => 1.32 ===
--- ZODB/src/ZODB/tests/PackableStorage.py:1.31	Thu Feb 26 19:31:55 2004
+++ ZODB/src/ZODB/tests/PackableStorage.py	Thu Mar 11 22:11:34 2004
@@ -152,7 +152,7 @@
         self._initroot()
         self._storage.pack(time.time() - 10000, referencesf)
 
-    def _PackWhileWriting(self, pack_now=0):
+    def _PackWhileWriting(self, pack_now):
         # A storage should allow some reading and writing during
         # a pack.  This test attempts to exercise locking code
         # in the storage to test that it is safe.  It generates
@@ -186,9 +186,29 @@
 
         for t in threads:
             t.join(30)
-        for t in threads:
-            t.join(1)
-            self.assert_(not t.isAlive())
+        liveness = [t.isAlive() for t in threads]
+        if True in liveness:
+            # They should have finished by now.
+            print 'Liveness:', liveness
+            # Display how far each thread got, one column per thread.
+            i = 0
+            fmt = "(%2s %10s)"
+            while True:
+                found_one = False
+                columns = []
+                for t in threads:
+                    if i < len(t.outcomes):
+                        found_one = True
+                        result = tuple(t.outcomes[i])
+                    else:
+                        result = ('--', '--')
+                    columns.append(fmt % result)
+                if found_one:
+                    print ' '.join(columns)
+                    i += 1
+                else:
+                    break
+            self.fail('a thread is still alive')
 
         # Iterate over the storage to make sure it's sane, but not every
         # storage supports iterators.
@@ -202,10 +222,10 @@
         iter.close()
 
     def checkPackWhileWriting(self):
-        self._PackWhileWriting(pack_now=0)
+        self._PackWhileWriting(pack_now=False)
 
     def checkPackNowWhileWriting(self):
-        self._PackWhileWriting(pack_now=1)
+        self._PackWhileWriting(pack_now=True)
 
 class PackableUndoStorage(PackableStorageBase):
 
@@ -550,19 +570,27 @@
         # what can we assert about that?
 
 
+# A number of these threads are kicked off by _PackWhileWriting().  Their
+# purpose is to abuse the database passed to the constructor with lots of
+# random write activity while the main thread is packing it.
 class ClientThread(TestThread):
 
     def __init__(self, db, choices):
         TestThread.__init__(self)
         self.root = db.open().root()
         self.choices = choices
+        # list of pairs, (root index written to, 'OK' or 'Conflict')
+        self.outcomes = []
 
     def runtest(self):
         from random import choice
 
         for j in range(50):
             try:
-                self.root[choice(self.choices)].value = MinPO(j)
+                index = choice(self.choices)
+                self.root[index].value = MinPO(j)
                 get_transaction().commit()
+                self.outcomes.append((index, 'OK'))
             except ConflictError:
                 get_transaction().abort()
+                self.outcomes.append((index, 'Conflict'))




More information about the Zodb-checkins mailing list