[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