[Zodb-checkins] SVN: ZODB/trunk/src/ZEO/ The storage server is now multi-threaded.

Jim Fulton jim at zope.com
Mon Feb 1 14:12:16 EST 2010


Log message for revision 108694:
  The storage server is now multi-threaded.
  

Changed:
  U   ZODB/trunk/src/ZEO/StorageServer.py
  U   ZODB/trunk/src/ZEO/zrpc/connection.py

-=-
Modified: ZODB/trunk/src/ZEO/StorageServer.py
===================================================================
--- ZODB/trunk/src/ZEO/StorageServer.py	2010-02-01 16:17:32 UTC (rev 108693)
+++ ZODB/trunk/src/ZEO/StorageServer.py	2010-02-01 19:12:15 UTC (rev 108694)
@@ -1346,7 +1346,7 @@
         self.rpc.callAsync('endVerify')
 
     def invalidateTransaction(self, tid, args):
-        self.rpc.callAsyncNoPoll('invalidateTransaction', tid, args)
+        self.rpc.callAsync('invalidateTransaction', tid, args)
 
     def serialnos(self, arg):
         self.rpc.callAsyncNoPoll('serialnos', arg)
@@ -1372,11 +1372,11 @@
 class ClientStub308(ClientStub):
 
     def invalidateTransaction(self, tid, args):
-        self.rpc.callAsyncNoPoll(
-            'invalidateTransaction', tid, [(arg, '') for arg in args])
+        ClientStub.invalidateTransaction(
+            self, tid, [(arg, '') for arg in args])
 
     def invalidateVerify(self, oid):
-        self.rpc.callAsync('invalidateVerify', (oid, ''))
+        ClientStub.invalidateVerify(self, (oid, ''))
 
 class ZEOStorage308Adapter:
 

Modified: ZODB/trunk/src/ZEO/zrpc/connection.py
===================================================================
--- ZODB/trunk/src/ZEO/zrpc/connection.py	2010-02-01 16:17:32 UTC (rev 108693)
+++ ZODB/trunk/src/ZEO/zrpc/connection.py	2010-02-01 19:12:15 UTC (rev 108694)
@@ -560,15 +560,18 @@
     # Exception types that should not be logged:
     unlogged_exception_types = (ZODB.POSException.POSKeyError, )
 
-    # Servers use a shared server trigger that uses the asyncore socket map
-    trigger = ZEO.zrpc.trigger.trigger()
-    call_from_thread = trigger.pull_trigger
-
     def __init__(self, sock, addr, obj, mgr):
         self.mgr = mgr
-        Connection.__init__(self, sock, addr, obj, 'S')
+        map = {}
+        Connection.__init__(self, sock, addr, obj, 'S', map=map)
         self.marshal = ServerMarshaller()
+        self.trigger = ZEO.zrpc.trigger.trigger(map)
+        self.call_from_thread = self.trigger.pull_trigger
 
+        t = threading.Thread(target=server_loop, args=(map,))
+        t.setDaemon(True)
+        t.start()
+
     def handshake(self):
         # Send the server's preferred protocol to the client.
         self.message_output(self.current_protocol)
@@ -601,6 +604,13 @@
 
     poll = smac.SizedMessageAsyncConnection.handle_write
 
+def server_loop(map):
+    while len(map) > 1:
+        asyncore.poll(30.0, map)
+
+    for o in map.values():
+        o.close()
+
 class ManagedClientConnection(Connection):
     """Client-side Connection subclass."""
     __super_init = Connection.__init__
@@ -714,10 +724,6 @@
 
         self.trigger.pull_trigger()
 
-        # Delay used when we call asyncore.poll() directly.
-        # Start with a 1 msec delay, double until 1 sec.
-        delay = 0.001
-
         self.replies_cond.acquire()
         try:
             while 1:



More information about the Zodb-checkins mailing list