[jboss-svn-commits] JBL Code SVN: r25431 - in labs/jbosstm/trunk: ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Feb 26 06:15:58 EST 2009


Author: jhalliday
Date: 2009-02-26 06:15:58 -0500 (Thu, 26 Feb 2009)
New Revision: 25431

Modified:
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/common/Environment.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TwoPhaseCoordinator.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TxControl.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/etc/default-arjuna-properties.xml
   labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/orbspecific/coordinator/ArjunaTransactionImple.java
Log:
Added config option to change behaviour of beforeCompletion syncs on transactions that are known to be unable to commit e.g. after setRollbackOnly.  JBTM-496


Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/common/Environment.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/common/Environment.java	2009-02-26 07:04:15 UTC (rev 25430)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/common/Environment.java	2009-02-26 11:15:58 UTC (rev 25431)
@@ -153,6 +153,7 @@
     public static final String SOCKET_PROCESS_ID_MAX_PORTS= "com.arjuna.ats.internal.arjuna.utils.SocketProcessIdMaxPorts";
     public static final String PROCESS_IMPLEMENTATION = "com.arjuna.ats.internal.arjuna.utils.processImplementation";
     public static final String PROCESS_IDENTIFIER = "com.arjuna.ats.internal.arjuna.utils.pid";
+    public static final String BEFORECOMPLETION_WHEN_ROLLBACKONLY = "com.arjuna.ats.coordinator.beforeCompletionWhenRollbackOnly";
     
     /**
       * Constant that holds the name of the environment property

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TwoPhaseCoordinator.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TwoPhaseCoordinator.java	2009-02-26 07:04:15 UTC (rev 25430)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TwoPhaseCoordinator.java	2009-02-26 11:15:58 UTC (rev 25431)
@@ -82,8 +82,14 @@
 
 		if (parent() != null)
 			parent().removeChildAction(this);
-
-		if (beforeCompletion())
+        
+        boolean canEnd = true;
+        if(status() != ActionStatus.ABORT_ONLY || TxControl.isBeforeCompletionWhenRollbackOnly())
+        {
+            canEnd = beforeCompletion();
+        }
+        
+		if (canEnd)
 		{
 			outcome = super.End(report_heuristics);
 		}

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TxControl.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TxControl.java	2009-02-26 07:04:15 UTC (rev 25430)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TxControl.java	2009-02-26 11:15:58 UTC (rev 25431)
@@ -274,7 +274,12 @@
 		xaNodeName = name;
 	}
 
-	private final static synchronized void createTransactionStatusManager ()
+    public static boolean isBeforeCompletionWhenRollbackOnly()
+    {
+        return beforeCompletionWhenRollbackOnly;
+    }
+
+    private final static synchronized void createTransactionStatusManager ()
 	{
 	    if (transactionStatusManager == null && _enableTSM)
 	    {
@@ -332,6 +337,8 @@
 	static int _defaultTimeout = 60; // 60 seconds
 
 	static boolean _enableTSM = true;
+    
+    static boolean beforeCompletionWhenRollbackOnly = false;
 	
 	static Thread _shutdownHook = null;
 	
@@ -428,6 +435,15 @@
 				TxControl.enable = false;
 		}
 
+        env = arjPropertyManager.propertyManager
+                .getProperty(Environment.BEFORECOMPLETION_WHEN_ROLLBACKONLY);
+        
+        if(env != null)
+        {
+            if(env.compareTo("YES") == 0)
+                TxControl.beforeCompletionWhenRollbackOnly = true;
+        }
+        
 		env = arjPropertyManager.propertyManager
 				.getProperty(Environment.XA_NODE_IDENTIFIER);
 		boolean writeNodeName = false;

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/etc/default-arjuna-properties.xml
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/etc/default-arjuna-properties.xml	2009-02-26 07:04:15 UTC (rev 25430)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/etc/default-arjuna-properties.xml	2009-02-26 11:15:58 UTC (rev 25431)
@@ -239,5 +239,14 @@
           name="com.arjuna.ats.arjuna.common.varDir"
           value="var"/>
       -->
+      
+        <!-- Should beforeCompletion synchronizations be fired even when it is known the
+             transaction can't commit e.g. is marked rollbackOnly? (default NO).
+             Note that turning this on still does not guarantee the syncronizations will run in all cases
+             e.g. explicit rollback() calls. JTS users should also take into account the supportRollbackSync
+             property which affects both beforeCompletion and afterCompletion syncs. -->
+      <!--
+      <property name="com.arjuna.ats.coordinator.beforeCompletionWhenRollbackOnly" value="NO"/>
+      -->
     </properties>
 </transaction-service>

Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/orbspecific/coordinator/ArjunaTransactionImple.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/orbspecific/coordinator/ArjunaTransactionImple.java	2009-02-26 07:04:15 UTC (rev 25430)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/orbspecific/coordinator/ArjunaTransactionImple.java	2009-02-26 11:15:58 UTC (rev 25431)
@@ -56,13 +56,7 @@
 
 import com.arjuna.orbportability.*;
 
-import com.arjuna.ats.arjuna.coordinator.BasicAction;
-import com.arjuna.ats.arjuna.coordinator.ActionStatus;
-import com.arjuna.ats.arjuna.coordinator.TwoPhaseOutcome;
-import com.arjuna.ats.arjuna.coordinator.AbstractRecord;
-import com.arjuna.ats.arjuna.coordinator.AddOutcome;
-import com.arjuna.ats.arjuna.coordinator.CheckedAction;
-import com.arjuna.ats.arjuna.coordinator.TransactionReaper;
+import com.arjuna.ats.arjuna.coordinator.*;
 import com.arjuna.ats.arjuna.objectstore.ObjectStore;
 import com.arjuna.ats.arjuna.state.*;
 import com.arjuna.ats.arjuna.common.*;
@@ -350,7 +344,13 @@
 			try
 			{
 				if (_synchs != null)
-					doBeforeCompletion();
+                {
+					if(outcome == ActionStatus.RUNNING ||
+                            (outcome == ActionStatus.ABORT_ONLY && TxControl.isBeforeCompletionWhenRollbackOnly()))
+                    {
+                        doBeforeCompletion();
+                    }
+                }
 			}
 			catch (Exception e)
 			{
@@ -436,32 +436,33 @@
 				|| (status == ActionStatus.ABORT_ONLY)) // already aborted?
 		{
 
-			// TODO is this right - surely only before commit?
+            if (ArjunaTransactionImple._syncOn)
+            {
+                if(TxControl.isBeforeCompletionWhenRollbackOnly())
+                {
+                    try
+                    {
+                        if (_synchs != null)
+                            doBeforeCompletion();
+                    }
+                    catch (Exception e)
+                    {
+                        /*
+                           * Don't do anything - we're about to rollback anyway!
+                           */
+                    }
+                }
+            }
+            else
+            {
+                /*
+                     * If we have any synchronizations delete them now. Can only be
+                     * a top-level action.
+                     */
 
-			if (ArjunaTransactionImple._syncOn)
-			{
-				try
-				{
-					if (_synchs != null)
-						doBeforeCompletion();
-				}
-				catch (Exception e)
-				{
-					/*
-					 * Don't do anything - we're about to rollback anyway!
-					 */
-				}
-			}
-			else
-			{
-				/*
-				 * If we have any synchronizations delete them now. Can only be
-				 * a top-level action.
-				 */
+                _synchs = null;
+            }
 
-				_synchs = null;
-			}
-
 			/*
 			 * Remove uid of this action from parent even if remote.
 			 */
@@ -1753,19 +1754,29 @@
 			 * top-level action.
 			 */
 
-			if (_synchs != null)
+			if (ArjunaTransactionImple._syncOn)
 			{
-				if (ArjunaTransactionImple._syncOn)
-				{
-					try
-					{
-						if (_synchs != null)
-							doBeforeCompletion();
-					}
-					catch (Exception e)
-					{
-					}
-				}
+                if(TxControl.isBeforeCompletionWhenRollbackOnly())
+                {
+                    try
+                    {
+                        if (_synchs != null)
+                            doBeforeCompletion();
+                    }
+                    catch (Exception e)
+                    {
+                        /*
+                           * Don't do anything - we're about to rollback anyway!
+                           */
+                    }
+                }
+			}
+			else
+			{
+				/*
+				 * If we have any synchronizations delete them now. Can only be
+				 * a top-level action.
+				 */
 
 				_synchs = null;
 			}




More information about the jboss-svn-commits mailing list