[Neo-report] r1772 vincent - in /trunk/neo: ./ client/handlers/ tests/

nobody at svn.erp5.org nobody at svn.erp5.org
Tue Feb 16 12:07:54 CET 2010


Author: vincent
Date: Tue Feb 16 12:07:51 2010
New Revision: 1772

Log:
Replace dipatcher.pop by dispatcher.dispatch .

It is important that unregistering a response from dispatcher and putting
it in its queue are atomic at dispatcher level to support askStoreObject
pipelining.

Modified:
    trunk/neo/client/handlers/__init__.py
    trunk/neo/dispatcher.py
    trunk/neo/tests/testDispatcher.py

Modified: trunk/neo/client/handlers/__init__.py
==============================================================================
--- trunk/neo/client/handlers/__init__.py [iso-8859-1] (original)
+++ trunk/neo/client/handlers/__init__.py [iso-8859-1] Tue Feb 16 12:07:51 2010
@@ -38,10 +38,8 @@
     def packetReceived(self, conn, packet):
         """Redirect all received packet to dispatcher thread."""
         if packet.isResponse():
-            queue = self.dispatcher.pop(conn, packet.getId(), None)
-            if queue is None:
+            if not self.dispatcher.dispatch(conn, packet.getId(), (conn, packet)):
                 raise ProtocolError('Unexpected response packet')
-            queue.put((conn, packet))
         else:
             self.dispatch(conn, packet)
 

Modified: trunk/neo/dispatcher.py
==============================================================================
--- trunk/neo/dispatcher.py [iso-8859-1] (original)
+++ trunk/neo/dispatcher.py [iso-8859-1] Tue Feb 16 12:07:51 2010
@@ -16,7 +16,6 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 from neo.locking import Lock
-MARKER = []
 EMPTY = {}
 
 def giant_lock(func):
@@ -38,12 +37,13 @@
         self.lock_release = lock.release
 
     @giant_lock
-    def pop(self, conn, msg_id, default=MARKER):
-        """Retrieve register-time provided payload."""
-        result = self.message_table.get(id(conn), EMPTY).pop(msg_id, default)
-        if result is MARKER:
-            raise KeyError, (id(conn), msg_id)
-        return result
+    def dispatch(self, conn, msg_id, data):
+        """Retrieve register-time provided queue, and put data in it."""
+        queue = self.message_table.get(id(conn), EMPTY).pop(msg_id, None)
+        if queue is None:
+            return False
+        queue.put(data)
+        return True
 
     @giant_lock
     def register(self, conn, msg_id, queue):

Modified: trunk/neo/tests/testDispatcher.py
==============================================================================
--- trunk/neo/tests/testDispatcher.py [iso-8859-1] (original)
+++ trunk/neo/tests/testDispatcher.py [iso-8859-1] Tue Feb 16 12:07:51 2010
@@ -19,6 +19,7 @@
 
 from mock import Mock
 from neo.dispatcher import Dispatcher
+from Queue import Queue
 
 class DispatcherTests(unittest.TestCase):
 
@@ -27,9 +28,15 @@
 
     def testRegister(self):
         conn = object()
-        self.dispatcher.register(conn, 1, 0)
-        self.assertEqual(self.dispatcher.pop(conn, 1, None), 0)
-        self.assertEqual(self.dispatcher.pop(conn, 2, 3), 3)
+        queue = Queue()
+        MARKER = object()
+        self.dispatcher.register(conn, 1, queue)
+        self.assertTrue(queue.empty())
+        self.assertTrue(self.dispatcher.dispatch(conn, 1, MARKER))
+        self.assertFalse(queue.empty())
+        self.assertTrue(queue.get(block=False) is MARKER)
+        self.assertTrue(queue.empty())
+        self.assertFalse(self.dispatcher.dispatch(conn, 2, None))
 
     def testUnregister(self):
         conn = object()
@@ -37,7 +44,7 @@
         self.dispatcher.register(conn, 2, queue)
         self.dispatcher.unregister(conn)
         self.assertEqual(len(queue.mockGetNamedCalls('put')), 1)
-        self.assertEqual(self.dispatcher.pop(conn, 2, 3), 3)
+        self.assertFalse(self.dispatcher.dispatch(conn, 2, None))
 
     def testRegistered(self):
         conn1 = object()





More information about the Neo-report mailing list