[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