[jboss-svn-commits] JBL Code SVN: r37604 - labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Oct 19 06:03:33 EDT 2011


Author: tomjenkinson
Date: 2011-10-19 06:03:32 -0400 (Wed, 19 Oct 2011)
New Revision: 37604

Modified:
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResource.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResourceRecovery.java
   labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ServerImpl.java
Log:
JBTM-895 use the classloader of the remote server to handle proxied requests

Modified: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResource.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResource.java	2011-10-19 09:48:30 UTC (rev 37603)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResource.java	2011-10-19 10:03:32 UTC (rev 37604)
@@ -35,10 +35,13 @@
 import org.jboss.tm.XAResourceWrapper;
 
 import com.arjuna.ats.arjuna.common.Uid;
-import com.arjuna.ats.arjuna.coordinator.TwoPhaseOutcome;
 import com.arjuna.ats.jta.distributed.server.DummyRemoteException;
 import com.arjuna.ats.jta.distributed.server.LookupProvider;
 
+/**
+ * I chose for this class to implement XAResourceWrapper so that I can provide a
+ * name to the Transaction manager for it to store in its XID.
+ */
 public class ProxyXAResource implements XAResource, XAResourceWrapper {
 
 	private int transactionTimeout;
@@ -48,12 +51,27 @@
 	private LookupProvider lookupProvider;
 	private Xid xid;
 
+	/**
+	 * Create a new proxy to the remote server.
+	 * 
+	 * @param lookupProvider
+	 * @param localServerName
+	 * @param remoteServerName
+	 */
 	public ProxyXAResource(LookupProvider lookupProvider, Integer localServerName, Integer remoteServerName) {
 		this.lookupProvider = lookupProvider;
 		this.localServerName = localServerName;
 		this.remoteServerName = remoteServerName;
 	}
 
+	/**
+	 * Used by recovery
+	 * 
+	 * @param lookupProvider
+	 * @param localServerName
+	 * @param file
+	 * @throws IOException
+	 */
 	public ProxyXAResource(LookupProvider lookupProvider, Integer localServerName, File file) throws IOException {
 		this.lookupProvider = lookupProvider;
 		this.localServerName = localServerName;
@@ -85,22 +103,37 @@
 		};
 	}
 
+	/**
+	 * Store the XID.
+	 */
 	@Override
 	public void start(Xid xid, int flags) throws XAException {
 		System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_START   [" + xid + "]");
 		this.xid = xid;
 	}
 
+	/**
+	 * Reference the XID.
+	 */
 	@Override
 	public void end(Xid xid, int flags) throws XAException {
 		System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_END     [" + xid + "]");
 		this.xid = null;
 	}
 
+	/**
+	 * Prepare the resource, save the XID locally first, the propagate the
+	 * prepare. This ensures that in recovery we know the XID to ask a remote
+	 * server about.
+	 */
 	@Override
 	public synchronized int prepare(Xid xid) throws XAException {
 		System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_PREPARE [" + xid + "]");
 
+		// Persist a proxy for the remote server this can mean we try to recover
+		// a transaction at a remote server that did not get chance to
+		// prepare but the alternative is to orphan a prepared server
+
 		try {
 			File dir = new File(System.getProperty("user.dir") + "/tmp/ProxyXAResource/" + localServerName + "/");
 			dir.mkdirs();
@@ -118,18 +151,13 @@
 			throw new XAException(XAException.XAER_RMERR);
 		}
 
-		ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
 		try {
-			Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
 			int propagatePrepare = lookupProvider.lookup(remoteServerName).propagatePrepare(xid);
 			System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_PREPARED");
 			return propagatePrepare;
 		} catch (DummyRemoteException ce) {
 			throw new XAException(XAException.XA_RETRY);
-		} finally {
-			Thread.currentThread().setContextClassLoader(contextClassLoader);
 		}
-
 	}
 
 	/**
@@ -139,15 +167,11 @@
 	public synchronized void commit(Xid xid, boolean onePhase) throws XAException {
 		System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_COMMIT  [" + xid + "]");
 
-		ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
 		try {
-			Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
 			lookupProvider.lookup(remoteServerName).propagateCommit(xid);
 			System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_COMMITED");
 		} catch (DummyRemoteException ce) {
 			throw new XAException(XAException.XA_RETRY);
-		} finally {
-			Thread.currentThread().setContextClassLoader(contextClassLoader);
 		}
 
 		if (file != null) {
@@ -158,15 +182,11 @@
 	@Override
 	public synchronized void rollback(Xid xid) throws XAException {
 		System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_ROLLBACK[" + xid + "]");
-		ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
 		try {
-			Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
 			lookupProvider.lookup(remoteServerName).propagateRollback(xid);
 			System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_ROLLBACKED");
 		} catch (DummyRemoteException ce) {
 			throw new XAException(XAException.XA_RETRY);
-		} finally {
-			Thread.currentThread().setContextClassLoader(contextClassLoader);
 		}
 
 		if (file != null) {
@@ -174,6 +194,16 @@
 		}
 	}
 
+	/**
+	 * This will ensure that the remote server has loaded the subordinate
+	 * transaction.
+	 * 
+	 * @return It returns the proxies view of the XID state, returning the
+	 *         remote servers view of the XID would present an XID to the local
+	 *         server that it knows nothing about and indeed potentially the
+	 *         remote server does not have a corresponding record of the XID in
+	 *         case of failure during prepare.
+	 */
 	@Override
 	public Xid[] recover(int flag) throws XAException {
 		Xid[] recovered = null;
@@ -187,14 +217,10 @@
 		}
 
 		if (this.xid != null) {
-			ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
 			try {
-				Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
 				recovered = lookupProvider.lookup(remoteServerName).propagateRecover(xid.getFormatId(), xid.getGlobalTransactionId(), flag);
 			} catch (DummyRemoteException ce) {
 				throw new XAException(XAException.XA_RETRY);
-			} finally {
-				Thread.currentThread().setContextClassLoader(contextClassLoader);
 			}
 		}
 
@@ -218,15 +244,11 @@
 	@Override
 	public void forget(Xid xid) throws XAException {
 		System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_FORGET  [" + xid + "]");
-		ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
 		try {
-			Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
 			lookupProvider.lookup(remoteServerName).propagateForget(xid);
 			System.out.println("     ProxyXAResource (" + localServerName + ":" + remoteServerName + ") XA_FORGETED[" + xid + "]");
 		} catch (DummyRemoteException ce) {
 			throw new XAException(XAException.XA_RETRY);
-		} finally {
-			Thread.currentThread().setContextClassLoader(contextClassLoader);
 		}
 	}
 
@@ -253,7 +275,7 @@
 	}
 
 	/**
-	 * I don't think this is used by TM.
+	 * Not used by the TM.
 	 */
 	@Override
 	public XAResource getResource() {
@@ -261,7 +283,7 @@
 	}
 
 	/**
-	 * I don't think this is used by TM.
+	 * Not used by the TM.
 	 */
 	@Override
 	public String getProductName() {
@@ -269,16 +291,20 @@
 	}
 
 	/**
-	 * I don't think this is used by TM.
+	 * Not used by the TM.
 	 */
 	@Override
 	public String getProductVersion() {
 		return null;
 	}
 
+	/**
+	 * This allows the proxy to contain meaningful information in the XID in
+	 * case of failure to recover.
+	 */
 	@Override
 	public String getJndiName() {
-		return "ProxyXAResource";
+		return "ProxyXAResource: " + localServerName + " " + remoteServerName;
 	}
 
 	public Xid getXid() {

Modified: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResourceRecovery.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResourceRecovery.java	2011-10-19 09:48:30 UTC (rev 37603)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResourceRecovery.java	2011-10-19 10:03:32 UTC (rev 37604)
@@ -36,7 +36,7 @@
 
 	private List<ProxyXAResource> resources = new ArrayList<ProxyXAResource>();
 
-	public ProxyXAResourceRecovery(LookupProvider lookupProvider, int id) throws IOException {
+	public ProxyXAResourceRecovery(LookupProvider lookupProvider, Integer id) throws IOException {
 		File file = new File(System.getProperty("user.dir") + "/tmp/ProxyXAResource/" + id + "/");
 		if (file.exists() && file.isDirectory()) {
 			File[] listFiles = file.listFiles();

Modified: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ServerImpl.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ServerImpl.java	2011-10-19 09:48:30 UTC (rev 37603)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ServerImpl.java	2011-10-19 10:03:32 UTC (rev 37604)
@@ -285,8 +285,12 @@
 
 	@Override
 	public int propagatePrepare(Xid xid) throws XAException, DummyRemoteException {
-		if (offline) {
-			throw new DummyRemoteException("Connection refused to: " + nodeName);
+		ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+		try {
+			Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+			
+		} finally {
+			Thread.currentThread().setContextClassLoader(contextClassLoader);			
 		}
 		SubordinateTransaction tx = SubordinationManager.getTransactionImporter().getImportedTransaction(xid);
 		return SubordinationManager.getXATerminator().prepare(xid);
@@ -294,53 +298,68 @@
 
 	@Override
 	public void propagateCommit(Xid xid) throws XAException, DummyRemoteException {
-		if (offline) {
-			throw new DummyRemoteException("Connection refused to: " + nodeName);
+		ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+		try {
+			Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+			SubordinationManager.getXATerminator().commit(xid, false);
+		} finally {
+			Thread.currentThread().setContextClassLoader(contextClassLoader);			
 		}
-		SubordinationManager.getXATerminator().commit(xid, false);
 	}
 
 	@Override
 	public void propagateRollback(Xid xid) throws XAException, DummyRemoteException {
-		if (offline) {
-			throw new DummyRemoteException("Connection refused to: " + nodeName);
+		ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+		try {
+			Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+			SubordinationManager.getXATerminator().rollback(xid);			
+		} finally {
+			Thread.currentThread().setContextClassLoader(contextClassLoader);			
 		}
-		SubordinationManager.getXATerminator().rollback(xid);
 	}
 
 	@Override
 	public Xid[] propagateRecover(int formatId, byte[] gtrid, int flag) throws XAException, DummyRemoteException {
-		if (offline) {
-			throw new DummyRemoteException("Connection refused to: " + nodeName);
-		}
-		List<Xid> toReturn = new ArrayList<Xid>();
-		Xid[] recovered = SubordinationManager.getXATerminator().recover(flag);
-		if (recovered != null) {
-			for (int i = 0; i < recovered.length; i++) {
-				// Filter out the transactions that are not owned by this parent
-				if (recovered[i].getFormatId() == formatId && Arrays.equals(gtrid, recovered[i].getGlobalTransactionId())) {
-					toReturn.add(recovered[i]);
+		ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+		try {
+			Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+			List<Xid> toReturn = new ArrayList<Xid>();
+			Xid[] recovered = SubordinationManager.getXATerminator().recover(flag);
+			if (recovered != null) {
+				for (int i = 0; i < recovered.length; i++) {
+					// Filter out the transactions that are not owned by this parent
+					if (recovered[i].getFormatId() == formatId && Arrays.equals(gtrid, recovered[i].getGlobalTransactionId())) {
+						toReturn.add(recovered[i]);
+					}
 				}
 			}
+			return toReturn.toArray(new Xid[0]);
+		} finally {
+			Thread.currentThread().setContextClassLoader(contextClassLoader);			
 		}
-		return toReturn.toArray(new Xid[0]);
 	}
 
 	@Override
 	public void propagateForget(Xid xid) throws XAException, DummyRemoteException {
-		if (offline) {
-			throw new DummyRemoteException("Connection refused to: " + nodeName);
+		ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+		try {
+			Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+			SubordinationManager.getXATerminator().forget(xid);
+		} finally {
+			Thread.currentThread().setContextClassLoader(contextClassLoader);			
 		}
-		SubordinationManager.getXATerminator().forget(xid);
 
 	}
 
 	@Override
 	public void propagateBeforeCompletion(Xid xid) throws XAException, SystemException, DummyRemoteException {
-		if (offline) {
-			throw new DummyRemoteException("Connection refused to: " + nodeName);
+		ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+		try {
+			Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+			((XATerminatorImple) SubordinationManager.getXATerminator()).beforeCompletion(xid);
+		} finally {
+			Thread.currentThread().setContextClassLoader(contextClassLoader);			
 		}
-		((XATerminatorImple) SubordinationManager.getXATerminator()).beforeCompletion(xid);
 	}
 
 	@Override



More information about the jboss-svn-commits mailing list