[Neo-report] r2809 jm - /trunk/neo/client/app.py

nobody at svn.erp5.org nobody at svn.erp5.org
Wed Aug 31 11:36:43 CEST 2011


Author: jm
Date: Wed Aug 31 11:36:42 2011
New Revision: 2809

Log:
client: fix condition in _handleConflicts to handle deadlock avoidance

Modified:
    trunk/neo/client/app.py

Modified: trunk/neo/client/app.py
==============================================================================
--- trunk/neo/client/app.py [iso-8859-1] (original)
+++ trunk/neo/client/app.py [iso-8859-1] Wed Aug 31 11:36:42 2011
@@ -577,18 +577,11 @@ class Application(object):
         resolved_conflict_serial_dict = txn_context[
             'resolved_conflict_serial_dict']
         for oid, conflict_serial_set in conflict_serial_dict.iteritems():
-            resolved_serial_set = resolved_conflict_serial_dict.setdefault(
-                oid, set())
             conflict_serial = max(conflict_serial_set)
-            if resolved_serial_set and conflict_serial <= max(
-                    resolved_serial_set):
-                # A later serial has already been resolved, skip.
-                resolved_serial_set.update(conflict_serial_set)
-                continue
             serial = object_serial_dict[oid]
             data = data_dict[oid]
             resolved = False
-            if conflict_serial == ZERO_TID:
+            if ZERO_TID in conflict_serial_set:
                 # Storage refused us from taking object lock, to avoid a
                 # possible deadlock. TID is actually used for some kind of
                 # "locking priority": when a higher value has the lock,
@@ -612,12 +605,20 @@ class Application(object):
                             neo.lib.logging.warning('Deadlock avoidance cannot'
                                 ' reliably work with undo, this must be '
                                 'implemented.')
+                            conflict_serial = ZERO_TID
                             break
                         self._store(txn_context, store_oid, store_serial,
                             store_data, unlock=True)
                 else:
                     resolved = True
             elif data is not None:
+                resolved_serial_set = resolved_conflict_serial_dict.setdefault(
+                    oid, set())
+                if resolved_serial_set and conflict_serial <= max(
+                        resolved_serial_set):
+                    # A later serial has already been resolved, skip.
+                    resolved_serial_set.update(conflict_serial_set)
+                    continue
                 new_data = tryToResolveConflict(oid, conflict_serial,
                     serial, data)
                 if new_data is not None:




More information about the Neo-report mailing list