SVN: ZODB/trunk/src/ZEO/ Reworked the timeout thread a little:

Jim Fulton <[email protected]>
Newsgroups gmane.comp.python.zope.zodb.cvs
Message-ID <[email protected]>
Log message for revision 111938:
  Reworked the timeout thread a little:
  - to use with
  - to use call_from_thread
  - to try to recover from errors (that should never happen:)
  
  Added timeout thread liveness to server status
  

Changed:
  U   ZODB/trunk/src/ZEO/StorageServer.py
  U   ZODB/trunk/src/ZEO/tests/testZEO.py
  U   ZODB/trunk/src/ZEO/tests/testZEO2.py

-=-
Modified: ZODB/trunk/src/ZEO/StorageServer.py
===================================================================
--- ZODB/trunk/src/ZEO/StorageServer.py	2010-05-04 18:38:09 UTC (rev 111937)
+++ ZODB/trunk/src/ZEO/StorageServer.py	2010-05-04 18:39:47 UTC (rev 111938)
@@ -1270,6 +1270,7 @@
         status = self.stats[storage_id].__dict__.copy()
         status['connections'] = len(status['connections'])
         status['waiting'] = len(self._waiting[storage_id])
+        status['timeout-thread-is-alive'] = self.timeouts[storage_id].isAlive()
         return status
 
 def _level_for_waiting(waiting):
@@ -1288,6 +1289,9 @@
     def end(self, client):
         pass
 
+    isAlive = lambda self: 'stub'
+
+
 class TimeoutThread(threading.Thread):
     """Monitors transaction progress and generates timeouts."""
 
@@ -1305,32 +1309,25 @@
     def begin(self, client):
         # Called from the restart code the "main" thread, whenever the
         # storage lock is being acquired.  (Serialized by asyncore.)
-        self._cond.acquire()
-        try:
+        with self._cond:
             assert self._client is None
             self._client = client
             self._deadline = time.time() + self._timeout
             self._cond.notify()
-        finally:
-            self._cond.release()
 
     def end(self, client):
         # Called from the "main" thread whenever the storage lock is
         # being released.  (Serialized by asyncore.)
-        self._cond.acquire()
-        try:
+        with self._cond:
             assert self._client is not None
             assert self._client is client
             self._client = None
             self._deadline = None
-        finally:
-            self._cond.release()
 
     def run(self):
         # Code running in the thread.
         while 1:
-            self._cond.acquire()
-            try:
+            with self._cond:
                 while self._deadline is None:
                     self._cond.wait()
                 howlong = self._deadline - time.time()
@@ -1338,12 +1335,16 @@
                     # Prevent reporting timeout more than once
                     self._deadline = None
                 client = self._client # For the howlong <= 0 branch below
-            finally:
-                self._cond.release()
+
             if howlong <= 0:
                 client.log("Transaction timeout after %s seconds" %
-                           self._timeout)
-                client.connection.trigger.pull_trigger(client.connection.close)
+                           self._timeout, logging.ERROR)
+                try:
+                    client.connection.call_from_thread(client.connection.close)
+                except:
+                    client.log("Timeout failure", logging.CRITICAL,
+                               exc_info=sys.exc_info())
+                    self.end(client)
             else:
                 time.sleep(howlong)
 

Modified: ZODB/trunk/src/ZEO/tests/testZEO.py
===================================================================
--- ZODB/trunk/src/ZEO/tests/testZEO.py	2010-05-04 18:38:09 UTC (rev 111937)
+++ ZODB/trunk/src/ZEO/tests/testZEO.py	2010-05-04 18:39:47 UTC (rev 111938)
@@ -1274,7 +1274,7 @@
     """
     You can get server status using the server_status method.
 
-    >>> addr, _ = start_server()
+    >>> addr, _ = start_server(zeo_conf=dict(transaction_timeout=1))
     >>> db = ZEO.DB(addr)
     >>> import pprint
     >>> pprint.pprint(db.storage.server_status(), width=1)
@@ -1288,6 +1288,7 @@
      'lock_time': None,
      'start': 'Tue May  4 10:55:20 2010',
      'stores': 1,
+     'timeout-thread-is-alive': True,
      'verifying_clients': 0,
      'waiting': 0}
 

Modified: ZODB/trunk/src/ZEO/tests/testZEO2.py
===================================================================
--- ZODB/trunk/src/ZEO/tests/testZEO2.py	2010-05-04 18:38:09 UTC (rev 111937)
+++ ZODB/trunk/src/ZEO/tests/testZEO2.py	2010-05-04 18:39:47 UTC (rev 111938)
@@ -344,6 +344,7 @@
      'lock_time': 1272653598.693882,
      'start': 'Fri Apr 30 14:53:18 2010',
      'stores': 13,
+     'timeout-thread-is-alive': 'stub',
      'verifying_clients': 0,
      'waiting': 9}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.