[Erp5-report] r20306 - /erp5/trunk/products/CMFActivity/Activity/
nobody at svn.erp5.org
nobody at svn.erp5.org
Fri Apr 4 13:42:44 CEST 2008
Author: vincent
Date: Fri Apr 4 13:42:43 2008
New Revision: 20306
URL: http://svn.erp5.org?rev=20306&view=rev
Log:
When SQL{Dict|Queue}_delMessage gets a lock error, retry. Do so infinitely, otherwise uid list would be lost and manual intervention would be required.
Modified:
erp5/trunk/products/CMFActivity/Activity/SQLBase.py
erp5/trunk/products/CMFActivity/Activity/SQLDict.py
erp5/trunk/products/CMFActivity/Activity/SQLQueue.py
Modified: erp5/trunk/products/CMFActivity/Activity/SQLBase.py
URL: http://svn.erp5.org/erp5/trunk/products/CMFActivity/Activity/SQLBase.py?rev=20306&r1=20305&r2=20306&view=diff
==============================================================================
--- erp5/trunk/products/CMFActivity/Activity/SQLBase.py (original)
+++ erp5/trunk/products/CMFActivity/Activity/SQLBase.py Fri Apr 4 13:42:43 2008
@@ -26,6 +26,10 @@
#
##############################################################################
+from _mysql_exceptions import OperationalError
+from MySQLdb.constants import ER
+from zLOG import LOG, INFO
+
class SQLBase:
"""
Define a set of common methods for SQL-based storage of activities.
@@ -49,3 +53,20 @@
if priority is None:
priority = default
return priority
+
+ def _retryOnLockError(self, method, args=(), kw=None):
+ if kw is None:
+ kw = {}
+ while True:
+ try:
+ result = method(*args, **kw)
+ except OperationalError, value:
+ if isinstance(value, OperationalError) and \
+ value[0] in (ER.LOCK_WAIT_TIMEOUT, ER.LOCK_DEADLOCK):
+ LOG('SQLBase', INFO, 'Got a lock error, retrying...')
+ else:
+ raise
+ else:
+ break
+ return result
+
Modified: erp5/trunk/products/CMFActivity/Activity/SQLDict.py
URL: http://svn.erp5.org/erp5/trunk/products/CMFActivity/Activity/SQLDict.py?rev=20306&r1=20305&r2=20306&view=diff
==============================================================================
--- erp5/trunk/products/CMFActivity/Activity/SQLDict.py (original)
+++ erp5/trunk/products/CMFActivity/Activity/SQLDict.py Fri Apr 4 13:42:43 2008
@@ -378,7 +378,7 @@
delay_uid_list.append(uid)
if len(deletable_uid_list):
try:
- activity_tool.SQLDict_delMessage(uid=deletable_uid_list)
+ self._retryOnLockError(activity_tool.SQLDict_delMessage, kw={'uid': deletable_uid_list})
except:
LOG('SQLDict', ERROR, 'Failed to delete messages %r' % (deletable_uid_list, ), error=sys.exc_info())
else:
Modified: erp5/trunk/products/CMFActivity/Activity/SQLQueue.py
URL: http://svn.erp5.org/erp5/trunk/products/CMFActivity/Activity/SQLQueue.py?rev=20306&r1=20305&r2=20306&view=diff
==============================================================================
--- erp5/trunk/products/CMFActivity/Activity/SQLQueue.py (original)
+++ erp5/trunk/products/CMFActivity/Activity/SQLQueue.py Fri Apr 4 13:42:43 2008
@@ -226,7 +226,7 @@
LOG('SQLQueue', TRACE, 'Freed message %r' % (uid, ))
if len(deletable_uid_list):
try:
- activity_tool.SQLQueue_delMessage(uid=deletable_uid_list)
+ self._retryOnLockError(activity_tool.SQLQueue_delMessage, kw={'uid': deletable_uid_list})
except:
LOG('SQLQueue', ERROR, 'Failed to delete messages %r' % (deletable_uid_list, ), error=sys.exc_info())
else:
More information about the Erp5-report
mailing list