[Neo-report] r2604 gregory - /trunk/neo/storage/app.py

nobody at svn.erp5.org nobody at svn.erp5.org
Mon Jan 10 18:02:10 CET 2011


Author: gregory
Date: Mon Jan 10 18:02:10 2011
New Revision: 2604

Log:
Counter event queue key reference counter instead of a set.

With conflict resolution, multiple stores can happen and register more than
once a event with a given key. Avoid crash on a KeyError exception when
removing the key from queued events.

Modified:
    trunk/neo/storage/app.py

Modified: trunk/neo/storage/app.py
==============================================================================
--- trunk/neo/storage/app.py [iso-8859-1] (original)
+++ trunk/neo/storage/app.py [iso-8859-1] Mon Jan 10 18:02:10 2011
@@ -72,7 +72,7 @@ class Application(object):
 
         # operation related data
         self.event_queue = None
-        self.event_queue_keys = None
+        self.event_queue_dict = None
         self.operational = False
 
         # ready is True when operational and got all informations
@@ -195,7 +195,7 @@ class Application(object):
                     conn.close()
             # create/clear event queue
             self.event_queue = deque()
-            self.event_queue_keys = set()
+            self.event_queue_dict = dict()
             try:
                 self.verifyData()
                 self.initialize()
@@ -324,22 +324,27 @@ class Application(object):
     def queueEvent(self, some_callable, conn, args, key=None,
             raise_on_duplicate=True):
         msg_id = conn.getPeerId()
-        keys = self.event_queue_keys
-        if raise_on_duplicate and key in keys:
+        event_queue_dict = self.event_queue_dict
+        if raise_on_duplicate and key in event_queue_dict:
             raise AlreadyPendingError()
         else:
             self.event_queue.append((key, some_callable, msg_id, conn, args))
             if key is not None:
-                keys.add(key)
+                try:
+                    event_queue_dict[key] += 1
+                except KeyError:
+                    event_queue_dict[key] = 1
 
     def executeQueuedEvents(self):
         l = len(self.event_queue)
         p = self.event_queue.popleft
-        remove = self.event_queue_keys.remove
+        event_queue_dict = self.event_queue_dict
         for _ in xrange(l):
             key, some_callable, msg_id, conn, args = p()
             if key is not None:
-                remove(key)
+                event_queue_dict[key] -= 1
+                if event_queue_dict[key] == 0:
+                    del event_queue_dict[key]
             if conn.isAborted() or conn.isClosed():
                 continue
             orig_msg_id = conn.getPeerId()




More information about the Neo-report mailing list