[Erp5-report] r17268 - in /erp5/trunk/products/CMFActivity/Activity: SQLDict.py SQLQueue.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Tue Oct 30 00:37:22 CET 2007
Author: seb
Date: Tue Oct 30 00:37:21 2007
New Revision: 17268
URL: http://svn.erp5.org?rev=17268&view=rev
Log:
- do not stock new ids used by activities into zodb, this improve
a lot performance under very high load
- add a round_robin_scheduling parameter for SQLQueue so that
all messages on a same path will not be processed on the same
node
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=17268&r1=17267&r2=17268&view=diff
==============================================================================
--- erp5/trunk/products/CMFActivity/Activity/SQLDict.py (original)
+++ erp5/trunk/products/CMFActivity/Activity/SQLDict.py Tue Oct 30 00:37:21 2007
@@ -95,7 +95,8 @@
for message in registered_message_list]
tag_list = [message.activity_kw.get('tag', '') for message in registered_message_list]
order_validation_text_list = [self.getOrderValidationText(message) for message in registered_message_list]
- uid_list = activity_tool.getPortalObject().portal_ids.generateNewLengthIdList(id_group='portal_activity', id_count=len(registered_message_list))
+ uid_list = activity_tool.getPortalObject().portal_ids.generateNewLengthIdList(id_group='portal_activity',
+ id_count=len(registered_message_list), store=0)
activity_tool.SQLDict_writeMessageList( uid_list = uid_list,
path_list = path_list,
method_id_list = method_id_list,
@@ -484,12 +485,12 @@
order_validation_text = line.order_validation_text)
self.getExecutableMessageList(activity_tool, message, message_dict,
validation_text_dict)
-
# XXX probably this below can be optimized by assigning multiple messages at a time.
path_dict = {}
assignMessage = activity_tool.SQLDict_assignMessage
processing_node = LAST_PROCESSING_NODE
id_tool = activity_tool.getPortalObject().portal_ids
+
for message in message_dict.itervalues():
path = '/'.join(message.object_path)
broadcast = message.activity_kw.get('broadcast', 0)
@@ -499,7 +500,8 @@
assignMessage(processing_node=1, uid=[uid])
if node_count > 1:
uid_list = id_tool.generateNewLengthIdList(id_group='portal_activity',
- id_count=node_count - 1)
+ id_count=node_count - 1,
+ store=0)
path_list = [path] * (node_count - 1)
method_id_list = [message.method_id] * (node_count - 1)
priority_list = [message.activity_kw.get('priority', 1)] * (node_count - 1)
Modified: erp5/trunk/products/CMFActivity/Activity/SQLQueue.py
URL: http://svn.erp5.org/erp5/trunk/products/CMFActivity/Activity/SQLQueue.py?rev=17268&r1=17267&r2=17268&view=diff
==============================================================================
--- erp5/trunk/products/CMFActivity/Activity/SQLQueue.py (original)
+++ erp5/trunk/products/CMFActivity/Activity/SQLQueue.py Tue Oct 30 00:37:21 2007
@@ -64,7 +64,7 @@
def prepareQueueMessage(self, activity_tool, m):
if m.is_registered:
id_tool = activity_tool.getPortalObject().portal_ids
- uid = id_tool.generateNewLengthId(id_group='portal_activity_queue')
+ uid = id_tool.generateNewLengthId(id_group='portal_activity_queue', store=0)
activity_tool.SQLQueue_writeMessage(uid = uid,
path = '/'.join(m.object_path) ,
method_id = m.method_id,
@@ -89,6 +89,10 @@
next_processing_date = now_date + float(VALIDATION_ERROR_DELAY)/86400
message_list = readMessage(processing_node=processing_node, to_date=now_date)
for line in message_list:
+ # Do not process many messages if there are long
+ new_date = DateTime()
+ if ((new_date-now_date)*86400) > 10:
+ break
path = line.path
method_id = line.method_id
# Make sure message can not be processed anylonger
@@ -331,7 +335,8 @@
assignMessage(processing_node=1, uid=message.uid)
if node_count > 1:
uid_list = id_tool.generateNewLengthIdList(id_group='portal_activity_queue',
- id_count=node_count - 1)
+ id_count=node_count - 1,
+ store=0)
priority = message.activity_kw.get('priority', 1)
dumped_message = self.dumpMessage(message)
date = message.activity_kw.get('at_date', now_date)
@@ -352,9 +357,11 @@
# the same node, so that object caching is more efficient. Otherwise, apply a round
# robin scheduling.
node = path_dict.get(path)
+ round_robin_scheduling = message.activity_kw.get('round_robin_scheduling', 0)
if node is None:
node = processing_node
- path_dict[path] = node
+ if not round_robin_scheduling:
+ path_dict[path] = node
processing_node += 1
if processing_node > node_count:
processing_node = 1
More information about the Erp5-report
mailing list