[Zodb-checkins] SVN: ZODB/branches/jim-dev/src/ZEO/ checkpoint

Jim Fulton jim at zope.com
Tue May 4 09:43:10 EDT 2010


Log message for revision 111916:
  checkpoint

Changed:
  U   ZODB/branches/jim-dev/src/ZEO/StorageServer.py
  U   ZODB/branches/jim-dev/src/ZEO/tests/forker.py
  U   ZODB/branches/jim-dev/src/ZEO/tests/testZEO.py
  U   ZODB/branches/jim-dev/src/ZEO/tests/testZEO2.py
  U   ZODB/branches/jim-dev/src/ZEO/zrpc/connection.py

-=-
Modified: ZODB/branches/jim-dev/src/ZEO/StorageServer.py
===================================================================
--- ZODB/branches/jim-dev/src/ZEO/StorageServer.py	2010-05-04 12:07:03 UTC (rev 111915)
+++ ZODB/branches/jim-dev/src/ZEO/StorageServer.py	2010-05-04 13:43:10 UTC (rev 111916)
@@ -447,16 +447,19 @@
     def vote(self, tid):
         self._check_tid(tid, exc=StorageTransactionError)
         if self.locked or self.server.already_waiting(self):
-            raise StorageTransactionError('Already voting %s' % self.locked)
+            raise StorageTransactionError(
+                'Already voting (%s)' % (self.locked and 'locked' or 'waiting')
+                )
         return self._try_to_vote()
 
     def _try_to_vote(self, delay=None):
         if self.connection is None:
             return # We're disconnected
-        if self.locked:
-            # as a consequence of the unlocking strategy,
-            # _try_to_vote may be called multiple times.
-            # Once we're locked, we should stop trying. :)
+        if delay is not None and delay.sent:
+            # as a consequence of the unlocking strategy, _try_to_vote
+            # may be called multiple times for delayed
+            # transactions. The first call will mark the delay as
+            # sent. We should skip if the delay was already sent.
             return
         self.locked, delay = self.server.lock_storage(self, delay)
         if self.locked:
@@ -504,6 +507,7 @@
                     delay.reply(None)
                 else:
                     return None
+
         else:
             return delay
 
@@ -1170,10 +1174,13 @@
             if storage_id in self._commit_locks:
                 # The lock is held by another zeostore
 
-                assert self._commit_locks[storage_id] is not zeostore
+                assert self._commit_locks[storage_id] is not zeostore, (
+                    storage_id, delay)
 
                 if delay is None:
                     # New request, queue it
+                    assert not [i for i in waiting if i[0] is zeostore
+                                ], "already waiting"
                     delay = Delay()
                     waiting.append((zeostore, delay))
                     zeostore.log("(%r) queue lock: transactions waiting: %s"
@@ -1186,7 +1193,7 @@
                 self._commit_locks[storage_id] = zeostore
                 self.timeouts[storage_id].begin(zeostore)
                 self.stats[storage_id].lock_time = time.time()
-                if delay:
+                if delay is not None:
                     # we were waiting, stop
                     waiting[:] = [i for i in waiting if i[0] is not zeostore]
                 zeostore.log("(%r) lock: transactions waiting: %s"
@@ -1206,6 +1213,8 @@
             callbacks = waiting[:]
 
         if callbacks:
+            assert not [i for i in waiting if i[0] is zeostore
+                        ], "waiting while unlocking"
             zeostore.log("(%r) unlock: transactions waiting: %s"
                          % (storage_id, len(callbacks)),
                          _level_for_waiting(callbacks)
@@ -1219,6 +1228,7 @@
                 except Exception:
                     logger.exception("Calling unlock callback")
 
+
     def stop_waiting(self, zeostore):
         storage_id = zeostore.storage_id
         waiting = self._waiting[storage_id]

Modified: ZODB/branches/jim-dev/src/ZEO/tests/forker.py
===================================================================
--- ZODB/branches/jim-dev/src/ZEO/tests/forker.py	2010-05-04 12:07:03 UTC (rev 111915)
+++ ZODB/branches/jim-dev/src/ZEO/tests/forker.py	2010-05-04 13:43:10 UTC (rev 111916)
@@ -91,7 +91,7 @@
 
 def start_zeo_server(storage_conf=None, zeo_conf=None, port=None, keep=False,
                      path='Data.fs', protocol=None, blob_dir=None,
-                     suicide=True, debug=False):
+                     suicide=True, debug=True):
     """Start a ZEO server in a separate process.
 
     Takes two positional arguments a string containing the storage conf

Modified: ZODB/branches/jim-dev/src/ZEO/tests/testZEO.py
===================================================================
--- ZODB/branches/jim-dev/src/ZEO/tests/testZEO.py	2010-05-04 12:07:03 UTC (rev 111915)
+++ ZODB/branches/jim-dev/src/ZEO/tests/testZEO.py	2010-05-04 13:43:10 UTC (rev 111916)
@@ -1219,7 +1219,7 @@
     ------
     --T INFO ZEO.runzeo () opening storage '1' using FileStorage
     ------
-    --T INFO ZEO.StorageServer () StorageServer created RW with storages 1RWt
+    --T INFO ZEO.StorageServer StorageServer created RW with storages 1RWt
     ------
     --T INFO ZEO.zrpc () listening on ...
     ------

Modified: ZODB/branches/jim-dev/src/ZEO/tests/testZEO2.py
===================================================================
--- ZODB/branches/jim-dev/src/ZEO/tests/testZEO2.py	2010-05-04 12:07:03 UTC (rev 111915)
+++ ZODB/branches/jim-dev/src/ZEO/tests/testZEO2.py	2010-05-04 13:43:10 UTC (rev 111916)
@@ -271,7 +271,7 @@
     >>> zs2.vote(tid2)
     Traceback (most recent call last):
     ...
-    StorageTransactionError: Already voting
+    StorageTransactionError: Already voting (locked)
 
     >>> tid1 = start_trans(zs1)
     >>> delay = zs1.vote(tid1)
@@ -283,7 +283,7 @@
     >>> zs1.vote(tid1)
     Traceback (most recent call last):
     ...
-    StorageTransactionError: Already voting
+    StorageTransactionError: Already voting (waiting)
 
 Note that the locking activity is logged at debug level to avoid
 cluttering log files, however, as the number of waiting votes

Modified: ZODB/branches/jim-dev/src/ZEO/zrpc/connection.py
===================================================================
--- ZODB/branches/jim-dev/src/ZEO/zrpc/connection.py	2010-05-04 12:07:03 UTC (rev 111915)
+++ ZODB/branches/jim-dev/src/ZEO/zrpc/connection.py	2010-05-04 13:43:10 UTC (rev 111916)
@@ -44,17 +44,25 @@
     the mainloop from sending a response.
     """
 
+    msgid = conn = sent = None
+
     def set_sender(self, msgid, conn):
         self.msgid = msgid
         self.conn = conn
 
     def reply(self, obj):
+        self.sent = 'reply'
         self.conn.send_reply(self.msgid, obj)
 
     def error(self, exc_info):
+        self.sent = 'error'
         log("Error raised in delayed method", logging.ERROR, exc_info=True)
         self.conn.return_error(self.msgid, *exc_info[:2])
 
+    def __repr__(self):
+        return "%s[%s, %r, %r, %r]" % (
+            self.__class__.__name__, id(self), self.msgid, self.conn, self.sent)
+
 class Result(Delay):
 
     def __init__(self, *args):



More information about the Zodb-checkins mailing list