[Erp5-report] r28426 - in /erp5/trunk/products/CMFActivity/Activity: SQLDict.py SQLQueue.py

nobody at svn.erp5.org nobody at svn.erp5.org
Tue Aug 18 08:23:51 CEST 2009


Author: yo
Date: Tue Aug 18 08:23:49 2009
New Revision: 28426

URL: http://svn.erp5.org?rev=28426&view=rev
Log:
Split multi-inserted messages into chunks, because an insert query generated by prepareQueueMessageList may exceed the limit of packet size defined by MySQL, when one transaction activate many, many methods. The max size is heuristic, though.

Modified:
    erp5/trunk/products/CMFActivity/Activity/SQLDict.py
    erp5/trunk/products/CMFActivity/Activity/SQLQueue.py

Modified: erp5/trunk/products/CMFActivity/Activity/SQLDict.py
URL: http://svn.erp5.org/erp5/trunk/products/CMFActivity/Activity/SQLDict.py?rev=28426&r1=28425&r2=28426&view=diff
==============================================================================
--- erp5/trunk/products/CMFActivity/Activity/SQLDict.py [utf8] (original)
+++ erp5/trunk/products/CMFActivity/Activity/SQLDict.py [utf8] Tue Aug 18 08:23:49 2009
@@ -56,6 +56,8 @@
 # objects are impacted by elected messages.
 MAX_GROUPED_OBJECTS = 100
 
+MAX_MESSAGE_LIST_SIZE = 100
+
 class SQLDict(RAMDict, SQLBase):
   """
     A simple OOBTree based queue. It should be compatible with transactions
@@ -64,11 +66,9 @@
   """
   # Transaction commit methods
   def prepareQueueMessageList(self, activity_tool, message_list):
-    registered_message_list = []
-    for message in message_list:
-      if message.is_registered:
-        registered_message_list.append(message)
-    if len(registered_message_list) > 0:
+    message_list = [m for m in message_list if m.is_registered]
+    for i in xrange(0, len(message_list), MAX_MESSAGE_LIST_SIZE):
+      registered_message_list = message_list[i:i + MAX_MESSAGE_LIST_SIZE]
       #LOG('SQLDict prepareQueueMessageList', 0, 'registered_message_list = %r' % (registered_message_list,))
       path_list = ['/'.join(message.object_path) for message in registered_message_list]
       active_process_uid_list = [message.active_process_uid for message in registered_message_list]

Modified: erp5/trunk/products/CMFActivity/Activity/SQLQueue.py
URL: http://svn.erp5.org/erp5/trunk/products/CMFActivity/Activity/SQLQueue.py?rev=28426&r1=28425&r2=28426&view=diff
==============================================================================
--- erp5/trunk/products/CMFActivity/Activity/SQLQueue.py [utf8] (original)
+++ erp5/trunk/products/CMFActivity/Activity/SQLQueue.py [utf8] Tue Aug 18 08:23:49 2009
@@ -65,6 +65,8 @@
 # first.
 MESSAGE_BUNDLE_SIZE = 1
 
+MAX_MESSAGE_LIST_SIZE = 100
+
 class SQLQueue(RAMQueue, SQLBase):
   """
     A simple OOBTree based queue. It should be compatible with transactions
@@ -73,8 +75,9 @@
   """
 
   def prepareQueueMessageList(self, activity_tool, message_list):
-    registered_message_list = [m for m in message_list if m.is_registered]
-    if len(registered_message_list):
+    message_list = [m for m in message_list if m.is_registered]
+    for i in xrange(0, len(message_list), MAX_MESSAGE_LIST_SIZE):
+      registered_message_list = message_list[i:i + MAX_MESSAGE_LIST_SIZE]
       uid_list = activity_tool.getPortalObject().portal_ids.generateNewLengthIdList(
         id_group='portal_activity_queue', id_count=len(registered_message_list),
         store=0)




More information about the Erp5-report mailing list