[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