[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