[jboss-svn-commits] JBL Code SVN: r37632 - labs/jbosstm/branches/JBOSSTS_4_15_0_Final/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 Oct 20 09:44:53 EDT 2011


Author: tomjenkinson
Date: 2011-10-20 09:44:52 -0400 (Thu, 20 Oct 2011)
New Revision: 37632

Modified:
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca/TransactionImporterImple.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca/XATerminatorImple.java
Log:
JBTM-932 updated to allow the recover call to recover in flight transactions when enabled

Modified: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca/TransactionImporterImple.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca/TransactionImporterImple.java	2011-10-20 12:37:51 UTC (rev 37631)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca/TransactionImporterImple.java	2011-10-20 13:44:52 UTC (rev 37632)
@@ -31,6 +31,8 @@
 
 package com.arjuna.ats.internal.jta.transaction.arjunacore.jca;
 
+import java.util.HashSet;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 import javax.transaction.SystemException;
@@ -93,7 +95,7 @@
 		{
 			imported = new TransactionImple(timeout, xid);
 			
-			_transactions.put(new SubordinateXidImple(xid), imported);
+			_transactions.put(new SubordinateXidImple(imported.baseXid()), imported);
 		}
 
 		return imported;
@@ -206,6 +208,13 @@
 
 		_transactions.remove(new SubordinateXidImple(xid));
 	}
+	
+	public Set<SubordinateXidImple> getInflightXids() {
+		Set<SubordinateXidImple> keySet = _transactions.keySet();
+		Set<SubordinateXidImple> toReturn = new HashSet<SubordinateXidImple>();
+		toReturn.addAll(keySet);
+		return toReturn;
+	}
 
 	private static ConcurrentHashMap<SubordinateXidImple, SubordinateTransaction> _transactions = new ConcurrentHashMap<SubordinateXidImple, SubordinateTransaction>();
 }

Modified: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca/XATerminatorImple.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca/XATerminatorImple.java	2011-10-20 12:37:51 UTC (rev 37631)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/jca/XATerminatorImple.java	2011-10-20 13:44:52 UTC (rev 37632)
@@ -32,10 +32,18 @@
 package com.arjuna.ats.internal.jta.transaction.arjunacore.jca;
 
 import java.io.IOException;
+import java.util.Iterator;
+import java.util.Set;
 import java.util.Stack;
 
-import javax.transaction.*;
-import javax.transaction.xa.*;
+import javax.transaction.HeuristicCommitException;
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.RollbackException;
+import javax.transaction.SystemException;
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
 
 import com.arjuna.ats.arjuna.common.Uid;
 import com.arjuna.ats.arjuna.coordinator.TwoPhaseOutcome;
@@ -46,6 +54,7 @@
 import com.arjuna.ats.internal.jta.recovery.arjunacore.NodeNameXAResourceOrphanFilter;
 import com.arjuna.ats.internal.jta.resources.spi.XATerminatorExtensions;
 import com.arjuna.ats.internal.jta.transaction.arjunacore.subordinate.jca.SubordinateAtomicAction;
+import com.arjuna.ats.internal.jta.transaction.arjunacore.subordinate.jca.TransactionImple;
 import com.arjuna.ats.jta.exceptions.UnexpectedConditionException;
 import com.arjuna.ats.jta.logging.jtaLogger;
 import com.arjuna.ats.jta.xa.XATxConverter;
@@ -326,7 +335,7 @@
         }
 
         // if we are here, then check the object store
-        return doRecover(0);
+        return doRecover(0, false);
     }
     
     /**
@@ -341,7 +350,7 @@
      * @return a list of potentially indoubt transactions or <code>null</code>.
      */
 
-    public synchronized Xid[] doRecover (Integer parentNodeName) throws XAException
+    public synchronized Xid[] doRecover (Integer parentNodeName, boolean recoverInflightTransactions) throws XAException
     {
         /*
          * Requires going through the objectstore for the states of imported
@@ -361,7 +370,7 @@
             if (recoveryStore.allObjUids(SubordinateAtomicAction.getType(), states)
                     && (states.notempty()))
             {
-                Stack values = new Stack();
+                Stack<Xid> values = new Stack<Xid>();
                 boolean finished = false;
 
                 do
@@ -388,10 +397,10 @@
 							if (jtaLogger.logger.isDebugEnabled()) {
 								jtaLogger.logger.debug("Found record for " + saa);
 							}
-							Transaction tx = SubordinationManager.getTransactionImporter().recoverTransaction(uid);
+							TransactionImple tx = (TransactionImple)SubordinationManager.getTransactionImporter().recoverTransaction(uid);
 
 							if (tx != null)
-								values.push(tx);
+								values.push(tx.baseXid());
 						}
                     }
                     else
@@ -400,6 +409,19 @@
                 }
                 while (!finished);
 
+                
+				if (recoverInflightTransactions) {
+					Set<SubordinateXidImple> inflightXids = ((TransactionImporterImple) SubordinationManager.getTransactionImporter()).getInflightXids();
+					Iterator<SubordinateXidImple> iterator = inflightXids.iterator();
+					while (iterator.hasNext()) {
+						SubordinateXidImple next = iterator.next();
+						if (parentNodeName.equals(NodeNameXAResourceOrphanFilter.RECOVER_ALL_NODES)
+								|| parentNodeName.equals(XATxConverter.getParentNodeName(next.getXID()))) {
+							values.push(next);
+						}
+					}
+				}
+                
                 if (values.size() > 0)
                 {
                     int index = 0;
@@ -408,10 +430,7 @@
 
                     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();
+                        indoubt[index] = values.pop();
                         index++;
                     }
                 }



More information about the jboss-svn-commits mailing list