[jboss-svn-commits] JBL Code SVN: r23861 - labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Thu Nov 13 09:51:32 EST 2008
Author: jhalliday
Date: 2008-11-13 09:51:31 -0500 (Thu, 13 Nov 2008)
New Revision: 23861
Modified:
labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca/XATerminatorImple.java
Log:
Merged fix for JBTM-427 from trunk to 4.2.3.SP
Modified: labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca/XATerminatorImple.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca/XATerminatorImple.java 2008-11-13 14:47:58 UTC (rev 23860)
+++ labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca/XATerminatorImple.java 2008-11-13 14:51:31 UTC (rev 23861)
@@ -1,20 +1,20 @@
/*
* JBoss, Home of Professional Open Source
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags.
* See the copyright.txt in the distribution for a
- * full listing of individual contributors.
+ * full listing of individual contributors.
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License, v. 2.1.
- * This program is distributed in the hope that it will be useful, but WITHOUT A
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License,
* v.2.1 along with this distribution; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
- *
+ *
* (C) 2005-2006,
* @author JBoss Inc.
*/
@@ -34,10 +34,7 @@
import java.io.IOException;
import java.util.Stack;
-import javax.transaction.HeuristicCommitException;
-import javax.transaction.HeuristicMixedException;
-import javax.transaction.HeuristicRollbackException;
-import javax.transaction.SystemException;
+import javax.transaction.*;
import javax.transaction.xa.*;
import com.arjuna.ats.arjuna.common.Uid;
@@ -51,7 +48,7 @@
/**
* The XATerminator implementation.
- *
+ *
* @author mcl
*
*/
@@ -62,36 +59,42 @@
/**
* Commit the transaction identified and hence any inflow-associated
* work.
- *
+ *
* @param xid the transaction to commit
* @param onePhase whether or not this is a one-phase commit (should only
* be <code>true</code> if there is a single resource associated with the
* transaction).
- *
+ *
* @exception XAException thrown if there are any errors, including if
* the transaction cannot commit and has to roll back.
*/
-
+
public void commit (Xid xid, boolean onePhase) throws XAException
{
try
{
TransactionImple tx = TxImporter.getImportedTransaction(xid);
-
+
if (tx == null)
throw new XAException(XAException.XAER_INVAL);
-
+
if (onePhase)
tx.doOnePhaseCommit();
else
tx.doCommit();
-
+
TxImporter.removeImportedTransaction(xid);
}
+ catch(RollbackException e) {
+ TxImporter.removeImportedTransaction(xid);
+ XAException xaException = new XAException(XAException.XA_RBROLLBACK);
+ xaException.initCause(e);
+ throw xaException;
+ }
catch (XAException ex)
{
TxImporter.removeImportedTransaction(xid);
-
+
throw ex;
}
catch (HeuristicRollbackException ex)
@@ -105,30 +108,30 @@
catch (SystemException ex)
{
TxImporter.removeImportedTransaction(xid);
-
+
throw new XAException(XAException.XAER_RMERR);
}
}
-
+
/**
* If the transaction subordinate generated a heuristic, then
* this operation will be called later once that heuristic has been
* resolved.
- *
+ *
* @param xid the transaction.
- *
+ *
* @throws XAException if any error happens.
*/
-
+
public void forget (Xid xid) throws XAException
{
try
{
TransactionImple tx = TxImporter.getImportedTransaction(xid);
-
+
if (tx == null)
throw new XAException(XAException.XAER_INVAL);
-
+
tx.doForget();
}
catch (Exception ex)
@@ -140,39 +143,58 @@
TxImporter.removeImportedTransaction(xid);
}
}
-
+
/**
* Prepare the imported transaction.
- *
+ *
* @param xid the transaction to prepare.
- *
+ *
* @throws XAException thrown if any error occurs, including if the
* transaction has rolled back.
- *
+ *
* @return either XAResource.XA_OK if the transaction prepared, or
* XAResource.XA_RDONLY if it was a read-only transaction (and in
* which case, a second phase message is not expected/required.)
*/
-
+
public int prepare (Xid xid) throws XAException
{
try
{
TransactionImple tx = TxImporter.getImportedTransaction(xid);
-
+
if (tx == null)
throw new XAException(XAException.XAER_INVAL);
-
+
switch (tx.doPrepare())
{
case TwoPhaseOutcome.PREPARE_READONLY:
TxImporter.removeImportedTransaction(xid);
-
- return XAResource.XA_RDONLY;
+ return XAResource.XA_RDONLY;
case TwoPhaseOutcome.PREPARE_NOTOK:
- TxImporter.removeImportedTransaction(xid); // TODO check if rollback is going to be called first
-
- throw new XAException(XAException.XA_RBROLLBACK);
+ // the JCA API spec limits what we can do in terms of reporting problems.
+ // try to use the exception code and cause to provide info whilst
+ // ramining API compliant. JBTM-427.
+ Exception initCause = null;
+ int xaExceptionCode = XAException.XA_RBROLLBACK;
+ try {
+ tx.doRollback();
+ } catch(HeuristicCommitException e) {
+ initCause = e;
+ xaExceptionCode = XAException.XAER_RMERR;
+ } catch (HeuristicMixedException e) {
+ initCause = e;
+ xaExceptionCode = XAException.XAER_RMERR;
+ } catch (SystemException e) {
+ initCause = e;
+ xaExceptionCode = XAException.XAER_RMERR;
+ }
+ TxImporter.removeImportedTransaction(xid);
+ XAException xaException = new XAException(xaExceptionCode);
+ if(initCause != null) {
+ xaException.initCause(initCause);
+ }
+ throw xaException;
case TwoPhaseOutcome.PREPARE_OK:
return XAResource.XA_OK;
default:
@@ -184,29 +206,29 @@
throw ex;
}
}
-
+
/**
* Return a list of indoubt transactions. This may include those
* transactions that are currently in-flight and running 2PC and do not need recovery
* invoked on them.
- *
+ *
* @param flag either XAResource.TMSTARTRSCAN to indicate the start of
* a recovery scan, or XAResource.TMENDRSCAN to indicate the end of
* the recovery scan.
- *
+ *
* @throws XAException thrown if any error occurs.
- *
+ *
* @return a list of potentially indoubt transactions or <code>null</code>.
*/
-
+
public Xid[] recover (int flag) throws XAException
- {
+ {
/*
* Requires going through the objectstore for the states of imported
* transactions. Our own crash recovery takes care of transactions imported
* via CORBA, Web Services etc.
*/
-
+
switch (flag)
{
case XAResource.TMSTARTRSCAN: // check the object store
@@ -227,23 +249,23 @@
default:
throw new XAException(XAException.XAER_PROTO);
}
-
+
// if we are here, then check the object store
-
+
Xid[] indoubt = null;
-
+
try
{
ObjectStore objStore = new ObjectStore(TxControl.getActionStoreType());
InputObjectState states = new InputObjectState();
-
+
// only look in the JCA section of the object store
-
+
if (objStore.allObjUids(SubordinateAtomicAction.getType(), states) && (states.notempty()))
{
Stack values = new Stack();
boolean finished = false;
-
+
do
{
Uid uid = new Uid(Uid.nullUid());
@@ -258,29 +280,29 @@
finished = true;
}
-
+
if (uid.notEquals(Uid.nullUid()))
{
TransactionImple tx = TxImporter.recoverTransaction(uid);
-
+
if (tx != null)
values.push(tx);
}
else
finished = true;
-
+
} while (!finished);
-
+
if (values.size() > 0)
{
int index = 0;
indoubt = new Xid[values.size()];
-
+
while (!values.empty())
{
com.arjuna.ats.internal.jta.transaction.arjunacore.subordinate.jca.TransactionImple tx = (com.arjuna.ats.internal.jta.transaction.arjunacore.subordinate.jca.TransactionImple) values.pop();
-
+
indoubt[index] = tx.baseXid();
index++;
}
@@ -291,35 +313,35 @@
{
ex.printStackTrace();
}
-
+
return indoubt;
}
/**
* Rollback the imported transaction subordinate.
- *
+ *
* @param xid the transaction to roll back.
- *
+ *
* @throws XAException thrown if there are any errors.
*/
-
+
public void rollback (Xid xid) throws XAException
{
try
{
TransactionImple tx = TxImporter.getImportedTransaction(xid);
-
+
if (tx == null)
throw new XAException(XAException.XAER_INVAL);
-
+
tx.doRollback();
-
+
TxImporter.removeImportedTransaction(xid);
}
catch (XAException ex)
{
TxImporter.removeImportedTransaction(xid);
-
+
throw ex;
}
catch (HeuristicCommitException ex)
@@ -333,11 +355,11 @@
catch (SystemException ex)
{
TxImporter.removeImportedTransaction(xid);
-
+
throw new XAException(XAException.XAER_RMERR);
}
}
-
+
private boolean _recoveryStarted = false;
-
+
}
More information about the jboss-svn-commits
mailing list