[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