From 1f9a2369082ff0d17f8ce1430fe22ba1a52aebd9 Mon Sep 17 00:00:00 2001
From: Jeremy Hylton <jeremy@svn.zope.org>
Date: Mon, 12 Aug 2002 18:27:14 +0000
Subject: [PATCH] Fix two apparent bugs in logic to handle waiting
 transactions.

tpc_abort() and tpc_finish() should always reset _transaction and
strategy attributes before calling _handle_waiting().  XXX Not sure
that it actually makes a difference, but the code seems simpler.

Only issues the "blocked transaction restarted" method when _restart()
returns true.
---
 src/ZEO/StorageServer.py | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/src/ZEO/StorageServer.py b/src/ZEO/StorageServer.py
index 8558749a..3c294ce6 100644
--- a/src/ZEO/StorageServer.py
+++ b/src/ZEO/StorageServer.py
@@ -314,17 +314,17 @@ class ZEOStorage:
         if invalidated:
             self.server.invalidate(self, self.__storage_id,
                                    invalidated, self.get_size_info())
-        if not self._handle_waiting():
-            self._transaction = None
-            self.strategy = None
+        self._transaction = None
+        self.strategy = None
+        self._handle_waiting()
 
     def tpc_abort(self, id):
         if not self._check_tid(id):
             return
         self.strategy.tpc_abort()
-        if not self._handle_waiting():
-            self._transaction = None
-            self.strategy = None
+        self._transaction = None
+        self.strategy = None
+        self._handle_waiting()
 
     # XXX handle new serialnos
 
@@ -363,7 +363,7 @@ class ZEOStorage:
             d = Delay()
             self.__storage._waiting.append((d, self))
             self._log("Transaction blocked waiting for storage. "
-                      "%d clients waiting." % len(self.__storage._waiting))
+                      "Clients waiting: %d." % len(self.__storage._waiting))
             return d
         else:
             self.restart()
@@ -372,13 +372,13 @@ class ZEOStorage:
         while self.__storage._waiting:
             delay, zeo_storage = self.__storage._waiting.pop(0)
             if self._restart(zeo_storage, delay):
-                break
-            if self.__storage._waiting:
-                n = len(self.__storage._waiting)
-                self._log("Blocked transaction restarted.  "
-                          "%d clients waiting." % n)
-            else:
-                self._log("Blocked transaction restarted.")
+                if self.__storage._waiting:
+                    n = len(self.__storage._waiting)
+                    self._log("Blocked transaction restarted.  "
+                              "Clients waiting: %d" % n)
+                else:
+                    self._log("Blocked transaction restarted.")
+                return
 
     def _restart(self, zeo_storage, delay):
         # Return True if the server restarted.
-- 
2.30.9