[jboss-svn-commits] JBL Code SVN: r37607 - in labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests: byteman-scripts and 3 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed Oct 19 09:52:37 EDT 2011
Author: tomjenkinson
Date: 2011-10-19 09:52:37 -0400 (Wed, 19 Oct 2011)
New Revision: 37607
Added:
labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/byteman-scripts/
labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/byteman-scripts/fail2pc.txt
Modified:
labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/SimpleIsolatedServers.java
labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/TestResource.java
labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/TestResourceRecovery.java
labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/IsolatableServersClassLoader.java
labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/LocalServer.java
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-917 added in a crash recovery test that uses byteman as well to simulate the server dieing
Added: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/byteman-scripts/fail2pc.txt
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/byteman-scripts/fail2pc.txt (rev 0)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/byteman-scripts/fail2pc.txt 2011-10-19 13:52:37 UTC (rev 37607)
@@ -0,0 +1,21 @@
+########################################################################
+#
+# byteman script used to ensure that tests can synchronize with various
+# actions performed by the recovery code
+
+#########################################################################
+# rules to identify progress of the periodic recovery listener thread
+#
+
+# if a test has set up a rendezvous under key "PR recovery pass begin" then
+# enter the rendezvous before starting the recovery run
+RULE Fail 2PC
+CLASS com.arjuna.ats.arjuna.coordinator.BasicAction
+METHOD phase2Commit
+AT ENTRY
+BIND NOTHING
+IF readCounter("phase2commit") == 0
+ DO debug("Called"),
+ incrementCounter("phase2commit");
+ Thread.currentThread().stop()
+ENDRULE
Modified: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/SimpleIsolatedServers.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/SimpleIsolatedServers.java 2011-10-19 13:51:23 UTC (rev 37606)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/SimpleIsolatedServers.java 2011-10-19 13:52:37 UTC (rev 37607)
@@ -41,8 +41,13 @@
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;
+import org.jboss.byteman.contrib.bmunit.BMScript;
+import org.jboss.byteman.contrib.bmunit.BMUnitRunner;
+import org.jboss.byteman.rule.exception.ExecuteException;
+import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
+import org.junit.runner.RunWith;
import com.arjuna.ats.arjuna.common.CoreEnvironmentBeanException;
import com.arjuna.ats.jta.distributed.server.CompletionCounter;
@@ -51,6 +56,7 @@
import com.arjuna.ats.jta.distributed.server.LookupProvider;
import com.arjuna.ats.jta.distributed.server.RemoteServer;
+ at RunWith(BMUnitRunner.class)
public class SimpleIsolatedServers {
private static LookupProvider lookupProvider = new MyLookupProvider();
private static LocalServer[] localServers = new LocalServer[3];
@@ -70,11 +76,77 @@
}
}
-// @Test
- public void testRecovery() throws IOException {
+ @AfterClass
+ public static void tearDown() throws Exception {
+ for (int i = 0; i < localServers.length; i++) {
+ ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(localServers[i].getClass().getClassLoader());
+ localServers[i].shutdown();
+ Thread.currentThread().setContextClassLoader(contextClassLoader);
+ }
+ }
+
+ @Test
+ @BMScript("fail2pc")
+ public void testRecovery() throws Exception {
assertTrue(getLocalServer(3000).getCompletionCounter().getCommitCount() == 0);
assertTrue(getLocalServer(2000).getCompletionCounter().getCommitCount() == 0);
assertTrue(getLocalServer(1000).getCompletionCounter().getCommitCount() == 0);
+ final Phase2CommitAborted phase2CommitAborted = new Phase2CommitAborted();
+ Thread thread = new Thread(new Runnable() {
+ public void run() {
+ File file = new File(System.getProperty("user.dir") + "/tmp/");
+ if (file.exists()) {
+ file.delete();
+ }
+ int startingTimeout = 0;
+ List<Integer> nodesToFlowTo = new LinkedList<Integer>(Arrays.asList(new Integer[] { 1000, 2000, 3000, 2000, 1000, 2000, 3000, 1000, 3000 }));
+ try {
+ doRecursiveTransactionalWork(startingTimeout, nodesToFlowTo, true);
+ } catch (InvalidTransactionException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IllegalStateException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (SecurityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (NotSupportedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (SystemException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (RollbackException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (XAException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (HeuristicMixedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (HeuristicRollbackException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (ExecuteException e) {
+ System.err.println("Should be a thread death but cest la vie");
+ synchronized (phase2CommitAborted) {
+ phase2CommitAborted.setPhase2CommitAborted(true);
+ phase2CommitAborted.notify();
+ }
+ }
+ }
+ });
+ thread.start();
+ synchronized (phase2CommitAborted) {
+ if (!phase2CommitAborted.isPhase2CommitAborted()) {
+ phase2CommitAborted.wait();
+ }
+ }
+ tearDown();
+ setup();
// Start out at the first server
// getLocalServer(3000).doRecoveryManagerScan();
// getLocalServer(2000).doRecoveryManagerScan();
@@ -341,4 +413,16 @@
}
}
+
+ private class Phase2CommitAborted {
+ private boolean phase2CommitAborted;
+
+ public boolean isPhase2CommitAborted() {
+ return phase2CommitAborted;
+ }
+
+ public void setPhase2CommitAborted(boolean phase2CommitAborted) {
+ this.phase2CommitAborted = phase2CommitAborted;
+ }
+ }
}
Modified: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/TestResource.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/TestResource.java 2011-10-19 13:51:23 UTC (rev 37606)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/TestResource.java 2011-10-19 13:52:37 UTC (rev 37607)
@@ -92,7 +92,7 @@
if (readonly)
return XA_RDONLY;
else {
- File dir = new File(System.getProperty("user.dir") + "/tmp/TestResource/" + serverId + "/");
+ File dir = new File(System.getProperty("user.dir") + "/distributedjta/TestResource/" + serverId + "/");
dir.mkdirs();
file = new File(dir, new Uid().fileStringForm() + "_");
try {
Modified: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/TestResourceRecovery.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/TestResourceRecovery.java 2011-10-19 13:51:23 UTC (rev 37606)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/TestResourceRecovery.java 2011-10-19 13:52:37 UTC (rev 37607)
@@ -37,7 +37,7 @@
private List<TestResource> resources = new ArrayList<TestResource>();
public TestResourceRecovery(CompletionCounter counter, Integer nodeName) throws IOException {
- File file = new File(System.getProperty("user.dir") + "/tmp/TestResource/" + nodeName + "/");
+ File file = new File(System.getProperty("user.dir") + "/distributedjta/TestResource/" + nodeName + "/");
if (file.exists() && file.isDirectory()) {
File[] listFiles = file.listFiles();
for (int i = 0; i < listFiles.length; i++) {
Modified: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/IsolatableServersClassLoader.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/IsolatableServersClassLoader.java 2011-10-19 13:51:23 UTC (rev 37606)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/IsolatableServersClassLoader.java 2011-10-19 13:52:37 UTC (rev 37607)
@@ -39,9 +39,7 @@
public IsolatableServersClassLoader(String ignoredPackage, ClassLoader parent) throws SecurityException, NoSuchMethodException, MalformedURLException {
super(parent);
this.ignoredPackage = ignoredPackage;
- System.out.println(Thread.currentThread().getContextClassLoader());
String property = System.getProperty("java.class.path");
- System.out.println(property);
String[] split = property.split(":");
URL[] urls = new URL[split.length];
for (int i = 0; i < urls.length; i++) {
@@ -51,7 +49,6 @@
} else {
urls[i] = new URL("file:" + url + "/");
}
- System.out.println(urls[i]);
}
this.ucp = new URLClassPath(urls);
}
Modified: labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/LocalServer.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/LocalServer.java 2011-10-19 13:51:23 UTC (rev 37606)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/LocalServer.java 2011-10-19 13:52:37 UTC (rev 37607)
@@ -66,4 +66,6 @@
public Xid getCurrentXid() throws SystemException;
public CompletionCounter getCompletionCounter();
+
+ public void shutdown() throws Exception;
}
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 13:51:23 UTC (rev 37606)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResource.java 2011-10-19 13:52:37 UTC (rev 37607)
@@ -135,7 +135,7 @@
// prepare but the alternative is to orphan a prepared server
try {
- File dir = new File(System.getProperty("user.dir") + "/tmp/ProxyXAResource/" + localServerName + "/");
+ File dir = new File(System.getProperty("user.dir") + "/distributedjta/ProxyXAResource/" + localServerName + "/");
dir.mkdirs();
file = new File(dir, new Uid().fileStringForm());
file.createNewFile();
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 13:51:23 UTC (rev 37606)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResourceRecovery.java 2011-10-19 13:52:37 UTC (rev 37607)
@@ -37,7 +37,7 @@
private List<ProxyXAResource> resources = new ArrayList<ProxyXAResource>();
public ProxyXAResourceRecovery(LookupProvider lookupProvider, Integer id) throws IOException {
- File file = new File(System.getProperty("user.dir") + "/tmp/ProxyXAResource/" + id + "/");
+ File file = new File(System.getProperty("user.dir") + "/distributedjta/ProxyXAResource/" + id + "/");
if (file.exists() && file.isDirectory()) {
File[] listFiles = file.listFiles();
for (int i = 0; i < listFiles.length; i++) {
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 13:51:23 UTC (rev 37606)
+++ labs/jbosstm/branches/JBOSSTS_4_15_0_Final/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ServerImpl.java 2011-10-19 13:52:37 UTC (rev 37607)
@@ -46,9 +46,11 @@
import com.arjuna.ats.arjuna.common.CoreEnvironmentBeanException;
import com.arjuna.ats.arjuna.common.ObjectStoreEnvironmentBean;
import com.arjuna.ats.arjuna.common.RecoveryEnvironmentBean;
+import com.arjuna.ats.arjuna.coordinator.TransactionReaper;
import com.arjuna.ats.arjuna.coordinator.TxControl;
import com.arjuna.ats.arjuna.recovery.RecoveryManager;
import com.arjuna.ats.arjuna.tools.osb.mbean.ObjStoreBrowser;
+import com.arjuna.ats.internal.arjuna.utils.ManualProcessId;
import com.arjuna.ats.internal.jbossatx.jta.XAResourceRecordWrappingPluginImpl;
import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple;
import com.arjuna.ats.internal.jta.transaction.arjunacore.jca.SubordinateTransaction;
@@ -131,9 +133,11 @@
recoveryEnvironmentBean.setRecoveryActivators(null);
CoreEnvironmentBean coreEnvironmentBean = com.arjuna.ats.arjuna.common.arjPropertyManager.getCoreEnvironmentBean();
- coreEnvironmentBean.setSocketProcessIdPort(4714 + nodeName);
+// coreEnvironmentBean.setSocketProcessIdPort(4714 + nodeName);
coreEnvironmentBean.setNodeIdentifier(nodeName);
- coreEnvironmentBean.setSocketProcessIdMaxPorts(1);
+// coreEnvironmentBean.setSocketProcessIdMaxPorts(1);
+ coreEnvironmentBean.setProcessImplementationClassName(ManualProcessId.class.getName());
+ coreEnvironmentBean.setPid(coreEnvironmentBean.getNodeIdentifier());
CoordinatorEnvironmentBean coordinatorEnvironmentBean = com.arjuna.ats.arjuna.common.arjPropertyManager.getCoordinatorEnvironmentBean();
coordinatorEnvironmentBean.setEnableStatistics(false);
@@ -143,15 +147,15 @@
ObjectStoreEnvironmentBean actionStoreObjectStoreEnvironmentBean = com.arjuna.common.internal.util.propertyservice.BeanPopulator.getNamedInstance(
com.arjuna.ats.arjuna.common.ObjectStoreEnvironmentBean.class, "default");
- actionStoreObjectStoreEnvironmentBean.setObjectStoreDir(System.getProperty("user.dir") + "/tmp/tx-object-store/" + nodeName);
+ actionStoreObjectStoreEnvironmentBean.setObjectStoreDir(System.getProperty("user.dir") + "/distributedjta/tx-object-store/" + nodeName);
ObjectStoreEnvironmentBean stateStoreObjectStoreEnvironmentBean = com.arjuna.common.internal.util.propertyservice.BeanPopulator.getNamedInstance(
com.arjuna.ats.arjuna.common.ObjectStoreEnvironmentBean.class, "stateStore");
- stateStoreObjectStoreEnvironmentBean.setObjectStoreDir(System.getProperty("user.dir") + "/tmp/tx-object-store/" + nodeName);
+ stateStoreObjectStoreEnvironmentBean.setObjectStoreDir(System.getProperty("user.dir") + "/distributedjta/tx-object-store/" + nodeName);
ObjectStoreEnvironmentBean communicationStoreObjectStoreEnvironmentBean = com.arjuna.common.internal.util.propertyservice.BeanPopulator
.getNamedInstance(com.arjuna.ats.arjuna.common.ObjectStoreEnvironmentBean.class, "communicationStore");
- communicationStoreObjectStoreEnvironmentBean.setObjectStoreDir(System.getProperty("user.dir") + "/tmp/tx-object-store/" + nodeName);
+ communicationStoreObjectStoreEnvironmentBean.setObjectStoreDir(System.getProperty("user.dir") + "/distributedjta/tx-object-store/" + nodeName);
ObjStoreBrowser objStoreBrowser = new ObjStoreBrowser();
Map<String, String> types = new HashMap<String, String>();
@@ -180,7 +184,7 @@
recoveryManagerService.create();
recoveryManagerService.addXAResourceRecovery(new ProxyXAResourceRecovery(lookupProvider, nodeName));
recoveryManagerService.addXAResourceRecovery(new TestResourceRecovery(counter, nodeName));
-
+
// recoveryManagerService.start();
_recoveryManager = RecoveryManager.manager();
RecoveryManager.manager().initialize();
@@ -201,6 +205,12 @@
}
@Override
+ public void shutdown() throws Exception {
+ recoveryManagerService.stop();
+ TransactionReaper.transactionReaper().terminate(false);
+ }
+
+ @Override
public void doRecoveryManagerScan() {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
ClassLoader serversClassLoader = this.getClass().getClassLoader();
@@ -288,9 +298,9 @@
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
-
+
} finally {
- Thread.currentThread().setContextClassLoader(contextClassLoader);
+ Thread.currentThread().setContextClassLoader(contextClassLoader);
}
SubordinateTransaction tx = SubordinationManager.getTransactionImporter().getImportedTransaction(xid);
return SubordinationManager.getXATerminator().prepare(xid);
@@ -303,7 +313,7 @@
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
SubordinationManager.getXATerminator().commit(xid, false);
} finally {
- Thread.currentThread().setContextClassLoader(contextClassLoader);
+ Thread.currentThread().setContextClassLoader(contextClassLoader);
}
}
@@ -312,9 +322,9 @@
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
- SubordinationManager.getXATerminator().rollback(xid);
+ SubordinationManager.getXATerminator().rollback(xid);
} finally {
- Thread.currentThread().setContextClassLoader(contextClassLoader);
+ Thread.currentThread().setContextClassLoader(contextClassLoader);
}
}
@@ -327,7 +337,8 @@
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
+ // 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]);
}
@@ -335,7 +346,7 @@
}
return toReturn.toArray(new Xid[0]);
} finally {
- Thread.currentThread().setContextClassLoader(contextClassLoader);
+ Thread.currentThread().setContextClassLoader(contextClassLoader);
}
}
@@ -346,7 +357,7 @@
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
SubordinationManager.getXATerminator().forget(xid);
} finally {
- Thread.currentThread().setContextClassLoader(contextClassLoader);
+ Thread.currentThread().setContextClassLoader(contextClassLoader);
}
}
@@ -358,7 +369,7 @@
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
((XATerminatorImple) SubordinationManager.getXATerminator()).beforeCompletion(xid);
} finally {
- Thread.currentThread().setContextClassLoader(contextClassLoader);
+ Thread.currentThread().setContextClassLoader(contextClassLoader);
}
}
More information about the jboss-svn-commits
mailing list