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