[jboss-svn-commits] JBL Code SVN: r35235 - labs/jbosstm/trunk/XTS/WS-T/dev/src11/com/arjuna/wst11/messaging/engines.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Sep 22 10:01:39 EDT 2010


Author: adinn
Date: 2010-09-22 10:01:38 -0400 (Wed, 22 Sep 2010)
New Revision: 35235

Modified:
   labs/jbosstm/trunk/XTS/WS-T/dev/src11/com/arjuna/wst11/messaging/engines/CoordinatorCompletionCoordinatorEngine.java
Log:
dealt with race condition which was stopping cannotComplete calls working underneath a coordinator completion participant complete callback - fixes JBTM-792

Modified: labs/jbosstm/trunk/XTS/WS-T/dev/src11/com/arjuna/wst11/messaging/engines/CoordinatorCompletionCoordinatorEngine.java
===================================================================
--- labs/jbosstm/trunk/XTS/WS-T/dev/src11/com/arjuna/wst11/messaging/engines/CoordinatorCompletionCoordinatorEngine.java	2010-09-22 13:36:49 UTC (rev 35234)
+++ labs/jbosstm/trunk/XTS/WS-T/dev/src11/com/arjuna/wst11/messaging/engines/CoordinatorCompletionCoordinatorEngine.java	2010-09-22 14:01:38 UTC (rev 35235)
@@ -438,19 +438,30 @@
         synchronized(this)
         {
             current = state ;
-            if ((current == State.STATE_ACTIVE) || (current == State.STATE_CANCELING_ACTIVE) ||
-        	(current == State.STATE_CANCELING_COMPLETING) || (current == State.STATE_COMPLETING))
+            if ((current == State.STATE_ACTIVE) ||
+                    (current == State.STATE_CANCELING_ACTIVE) ||
+                    (current == State.STATE_CANCELING_COMPLETING))
             {
                 changeState(State.STATE_NOT_COMPLETING) ;
             }
+            else if (current == State.STATE_COMPLETING)
+            {
+                // ending now avoids a race condition similar to the one for a fail message
+                // we set a failure state which ensures that any waiting coordinator detects
+                // that the complete has failed
+                failureState = State.STATE_NOT_COMPLETING;
+                ended();
+            }
         }
 
-        if ((current == State.STATE_ACTIVE) || (current == State.STATE_CANCELING_ACTIVE) ||
-            (current == State.STATE_CANCELING_COMPLETING) || (current == State.STATE_COMPLETING))
+        if ((current == State.STATE_ACTIVE) ||
+                (current == State.STATE_CANCELING_ACTIVE) ||
+                (current == State.STATE_CANCELING_COMPLETING))
         {
+            // we need to make sure the coordinator marks the participant as not completing
             executeCannotComplete() ;
         }
-        else if (current == State.STATE_ENDED)
+        else if ((current == State.STATE_COMPLETING) || (current == State.STATE_ENDED))
         {
             sendNotCompleted() ;
         }
@@ -642,9 +653,16 @@
         if (current == State.STATE_ACTIVE)
         {
             sendComplete() ;
-            return waitForState(State.STATE_COMPLETING, TransportTimer.getTransportTimeout()) ;
+            waitForState(State.STATE_COMPLETING, TransportTimer.getTransportTimeout()) ;
         }
-        return current ;
+
+        synchronized(this) {
+            if (state == State.STATE_ENDED && failureState != null) {
+                return failureState;
+            }
+
+            return state;
+        }
     }
 
     /**



More information about the jboss-svn-commits mailing list