[jboss-svn-commits] JBL Code SVN: r30896 - in labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java: org/jboss/jbossts/performance and 1 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sun Jan 3 17:05:10 EST 2010
Author: whitingjr
Date: 2010-01-03 17:05:09 -0500 (Sun, 03 Jan 2010)
New Revision: 30896
Added:
labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/org/jboss/jbossts/performance/MultiThreadedTest.java
labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/org/jboss/jbossts/performance/resource/SynchronizeTask.java
Modified:
labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/auction/test/basic/ProfiledStateTransitions.java
labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/org/jboss/jbossts/performance/MultiResourceTest.java
labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/org/jboss/jbossts/performance/WarmedUpTest.java
labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/org/jboss/jbossts/performance/resource/SynchronizeResourcesTest.java
Log:
Added support for multithreaded testing.
Modified: labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/auction/test/basic/ProfiledStateTransitions.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/auction/test/basic/ProfiledStateTransitions.java 2010-01-03 22:04:06 UTC (rev 30895)
+++ labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/auction/test/basic/ProfiledStateTransitions.java 2010-01-03 22:05:09 UTC (rev 30896)
@@ -321,29 +321,35 @@
{
if (null != controller)
{
+ /* Here we need to remove or disable table constraints. One of two techniques used.
+ * Which depends on the database vendor. Some have no support for disabling.*/
if (controller.isDisablePreferedOverDrop())
- {
+ {// disabled constraint
controller.relax(connection);
}
else
- {
+ {// delete constraint
configuration = getConfiguration();
dropStatements = configuration.generateDropSchemaScript(sessionFactory.getDialect());
controller.relax(connection, dropStatements);
}
+ /* Some vendors use table recycle bins to recover tables. The DBUnit system
+ * does not parse the recyclebin table names. Just purge recycle the recycle bin now. */
controller.purge(connection);
+ /* DBUnit now does it's work of loading the data. */
for (DatabaseOperation op : beforeTestOperations )
{
op.execute(iDatabaseConn , dataSet);
}
+ /* Reinstate the constraints. */
if (controller.isDisablePreferedOverDrop())
- {
+ {// enforce the constraints
controller.constrain (connection);
}
else
- {
+ {// re-create constraints
DatabaseMetadata metadata= new DatabaseMetadata(connection, sessionFactory.getDialect());
configuration.setProperty(Environment.DIALECT, sessionFactory.getDialect().getClass().getName());
Modified: labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/org/jboss/jbossts/performance/MultiResourceTest.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/org/jboss/jbossts/performance/MultiResourceTest.java 2010-01-03 22:04:06 UTC (rev 30895)
+++ labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/org/jboss/jbossts/performance/MultiResourceTest.java 2010-01-03 22:05:09 UTC (rev 30896)
@@ -32,10 +32,10 @@
public abstract class MultiResourceTest extends WarmedUpTest
{
-
- protected static class SessionSynchronization implements Synchronization
+ /*
+ public class SessionSynchronization implements Synchronization
{
- private static final Logger logger = Logger.getLogger(SessionSynchronization.class);
+ private final Logger logger = Logger.getLogger(SessionSynchronization.class);
private EntityManager manager;
private boolean closeAtTxCompletion;
@@ -58,11 +58,12 @@
}
}
}
+ */
@Override
protected boolean isMultiResourceTest()
{
- return true;
+ return false;
}
}
Added: labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/org/jboss/jbossts/performance/MultiThreadedTest.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/org/jboss/jbossts/performance/MultiThreadedTest.java (rev 0)
+++ labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/org/jboss/jbossts/performance/MultiThreadedTest.java 2010-01-03 22:05:09 UTC (rev 30896)
@@ -0,0 +1,30 @@
+package org.jboss.jbossts.performance;
+
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.Executor;
+
+public abstract class MultiThreadedTest extends MultiResourceTest
+{
+ @Override
+ public void startConcurrentExecutions(int recurseCount, int threadCount)
+ throws Exception
+ {
+ /**
+ * Here we will be using a cyclic barrier to organise the threads running
+ * the test case tasks and the monitor thread. This method should not complete
+ * until all workers have finished. The barrier is triggered and all fall out
+ * of method frame.
+ * This thread (monitor) is included in the barrier to ensure this thread
+ * remains active during all demon threads do processing.
+ */
+ CyclicBarrier completionBarrier = new CyclicBarrier(1 + threadCount);
+ for (int count = 0; count < threadCount; count += 1)
+ {
+ Executor executor = new ThreadPerTestWorkerExecutor();
+ executor.execute(getTask( recurseCount, completionBarrier));
+ }
+ completionBarrier.await();// start all the threads processing
+ completionBarrier.await();// all threads fall out of method frame
+ }
+
+}
Modified: labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/org/jboss/jbossts/performance/WarmedUpTest.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/org/jboss/jbossts/performance/WarmedUpTest.java 2010-01-03 22:04:06 UTC (rev 30895)
+++ labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/org/jboss/jbossts/performance/WarmedUpTest.java 2010-01-03 22:05:09 UTC (rev 30896)
@@ -1,90 +1,106 @@
- /*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
package org.jboss.jbossts.performance;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.Executor;
+
import org.apache.log4j.Logger;
-import org.testng.Assert;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import auction.test.basic.ProfiledStateTransitions;
-public abstract class WarmedUpTest extends ProfiledStateTransitions
+/**
+ * The purpose of this object is to run the test case several times to warm up
+ * the compiler.
+ *
+ * @author whitingjr
+ *
+ */
+public abstract class WarmedUpTest extends ProfiledStateTransitions
{
- private static final Logger logger =Logger.getLogger(WarmedUpTest.class);
+ private static final Logger logger = Logger.getLogger(WarmedUpTest.class);
+
+
@Test(groups = "integration-warmup")
- @Parameters ({"warmup_count"})
- public void warmupTest(String warmupCount)
+ @Parameters(
+ { "warmup_count" , "concurrency_count" })
+ public void warmupTest(final String warmupCountConfig, final String threadCountConfig)
+ throws Exception
{
- recurse(Integer.parseInt(warmupCount));
+ startConcurrentExecutions(Integer.parseInt(warmupCountConfig), Integer.parseInt(threadCountConfig));
}
-
- @Test(groups = "integration-persistence", dependsOnGroups="integration-warmup")
- @Parameters ({"test_count"})
- public void profiledTest(String testCount)
+
+ @Test(groups = "integration-persistence", dependsOnGroups = "integration-warmup")
+ @Parameters(
+ { "test_count", "concurrency_count" })
+ public void profiledTest(final String testCountConfig,
+ final String concurrentCountConfig)
+ throws Exception
{
try
{
getProfiler().start();
- }
- catch (Exception e)
+ } catch (Exception e)
{
logger.warn(e.getMessage());
}
-
- recurse(Integer.parseInt(testCount));
-
+ startConcurrentExecutions(Integer.parseInt(testCountConfig), Integer.parseInt(concurrentCountConfig));
try
{
getProfiler().stop();
- }
- catch (Exception e)
+ } catch (Exception e)
{
logger.warn(e.getMessage());
}
}
- private void recurse(int count)
+ /**
+ * The implementing method has to fulfil the contract that before the method
+ * completes all threads will have finished their work.
+ * @param recurseCount
+ * @param threadCount
+ * @throws Exception
+ */
+ public abstract void startConcurrentExecutions(int recurseCount, int threadCount) throws Exception;
+
+ public abstract Runnable getTask(int recurseCount, CyclicBarrier completionBarrier ) throws Exception;
+
+ public final class ThreadPerTestWorkerExecutor implements Executor
{
-
- for (int i = 0; i < count ; i += 1)
+ private final Logger logger = Logger.getLogger(ThreadPerTestWorkerExecutor.class);
+
+ @Override
+ public void execute(Runnable command)
{
- try
- {
- runTestBody();
- if (logger.isInfoEnabled())
- {
- logger.info("Executed profiled run of testbody.");
- }
- }
- catch (Exception e)
- {
- Assert.fail(e.getMessage(), e);
- }
+ Thread job = new Thread(command);
+ job.run();
}
-
+
+ public ThreadPerTestWorkerExecutor()
+ {
+ }
}
-
- protected abstract void runTestBody() throws Exception;
-
}
Modified: labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/org/jboss/jbossts/performance/resource/SynchronizeResourcesTest.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/org/jboss/jbossts/performance/resource/SynchronizeResourcesTest.java 2010-01-03 22:04:06 UTC (rev 30895)
+++ labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/org/jboss/jbossts/performance/resource/SynchronizeResourcesTest.java 2010-01-03 22:05:09 UTC (rev 30896)
@@ -22,78 +22,22 @@
package org.jboss.jbossts.performance.resource;
-import javax.persistence.PersistenceException;
+import java.util.concurrent.CyclicBarrier;
-import org.hibernate.HibernateException;
-import org.hibernate.Transaction;
-import org.hibernate.ejb.EntityManagerImpl;
-import org.jboss.jbossts.performance.MultiResourceTest;
-import org.jboss.tm.TransactionLocal;
-import org.testng.Assert;
+import org.jboss.jbossts.performance.MultiThreadedTest;
-import auction.dao.ejb3.persistence.UserDAOBeanMultiResource;
-import auction.model.User;
-
-public class SynchronizeResourcesTest extends MultiResourceTest
+public class SynchronizeResourcesTest extends MultiThreadedTest
{
-
@Override
- protected void runTestBody()
+ public Runnable getTask(int recurseCount, CyclicBarrier completionBarrier)
throws Exception
{
- EntityManagerImpl emA = null;
- EntityManagerImpl emB = null;
- try
- {
- emA = (EntityManagerImpl) getEntityManagerFactory().createEntityManager();
- emB = (EntityManagerImpl) getEntityManagerFactoryB().createEntityManager();
- Transaction transaction =emA.getSession().beginTransaction();
- TransactionLocal session = new TransactionLocal();
- transaction.registerSynchronization(new SessionSynchronization(emA, transaction, true));
-
- transaction.registerSynchronization(new SessionSynchronization( emB, transaction, true ) );
-
- session.set(emB);
- emB.joinTransaction();
-
- /**
- * A read
- * A [write]
- * B write
- */
- UserDAOBeanMultiResource userDAO_A = new UserDAOBeanMultiResource();
- userDAO_A.setEntityManagerA(emA);
- UserDAOBeanMultiResource userDAO_B = new UserDAOBeanMultiResource ();
- userDAO_B.setEntityManagerB(emB);
-
- // Prepare a user object
- User user = userDAO_A.findById(1l, false);
-
- long time = System.currentTimeMillis();
- if (this.isOptionalWriteEnabled)
- {
- user.setFirstname("Ben"+time);
- }
- // Don't forget to take the return value, this is basically a merge()
- User userB = userDAO_B.findById(1l, false);
- userB.setFirstname("Ben"+time);
- emA.flush();
- emB.flush();
-
- emA.getSession().getTransaction().commit();
- Assert.assertFalse(emA.isOpen());
- Assert.assertFalse(emB.isOpen());
- }
- catch (HibernateException e) {
- Assert.fail(e.getMessage());
- }
- catch (PersistenceException pe)
- {
- Assert.fail(pe.getMessage());
- }
- finally
- {
- }
+ return new SynchronizeTask(getEntityManagerFactory(), getEntityManagerFactoryB(), recurseCount, completionBarrier);
}
-
+ @Override
+ protected boolean isMultiResourceTest()
+ {
+ return true;
+ }
+
}
Added: labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/org/jboss/jbossts/performance/resource/SynchronizeTask.java
===================================================================
--- labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/org/jboss/jbossts/performance/resource/SynchronizeTask.java (rev 0)
+++ labs/jbosstm/workspace/whitingjr/trunk/performance/src/test/java/org/jboss/jbossts/performance/resource/SynchronizeTask.java 2010-01-03 22:05:09 UTC (rev 30896)
@@ -0,0 +1,167 @@
+package org.jboss.jbossts.performance.resource;
+
+import java.util.concurrent.CyclicBarrier;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.PersistenceException;
+import javax.transaction.Synchronization;
+
+import org.apache.log4j.Logger;
+import org.hibernate.HibernateException;
+import org.hibernate.Transaction;
+import org.hibernate.ejb.EntityManagerImpl;
+import org.jboss.tm.TransactionLocal;
+import org.testng.Assert;
+
+import auction.dao.ejb3.persistence.UserDAOBeanMultiResource;
+import auction.model.User;
+
+public class SynchronizeTask implements Runnable
+{
+ private final EntityManagerFactory emfA;
+ private final EntityManagerFactory emfB;
+ private final boolean isOptionalWriteEnabled = false;
+ private final int recurseCount;
+ private final static Logger logger = Logger.getLogger(SynchronizeTask.class);
+ private final CyclicBarrier completionBarrier;
+
+ public SynchronizeTask(final EntityManagerFactory factoryA, final EntityManagerFactory factoryB, final int count, final CyclicBarrier barrier)
+ {
+ this.emfA = factoryA;
+ this.emfB = factoryB;
+ this.recurseCount = count;
+ this.completionBarrier = barrier;
+ }
+ @Override
+ public void run()
+ {
+ try
+ {
+ this.completionBarrier.await();// await all threads ready to start
+ recurse(this.recurseCount);
+ this.completionBarrier.await();// await all threads have finished
+ }
+ catch (Exception e)
+ {
+ logger.error(e.getMessage(), e);
+ }
+ }
+
+ public void task()
+ {
+ EntityManagerImpl emA = null;
+ EntityManagerImpl emB = null;
+ try
+ {
+ emA = (EntityManagerImpl) getEMFactoryA().createEntityManager();
+ emB = (EntityManagerImpl) getEMFactoryB().createEntityManager();
+ Transaction transaction =emA.getSession().beginTransaction();
+ TransactionLocal session = new TransactionLocal();
+
+ transaction.registerSynchronization(new SessionSynchronization(emA, transaction, true));
+
+ transaction.registerSynchronization(new SessionSynchronization( emB, transaction, true ) );
+
+ session.set(emB);
+ emB.joinTransaction();
+
+ /**
+ * A read
+ * A [write]
+ * B write
+ */
+ UserDAOBeanMultiResource userDAO_A = new UserDAOBeanMultiResource();
+ userDAO_A.setEntityManagerA(emA);
+ UserDAOBeanMultiResource userDAO_B = new UserDAOBeanMultiResource ();
+ userDAO_B.setEntityManagerB(emB);
+
+ // Prepare a user object
+ User user = userDAO_A.findById(1l, false);
+
+ long time = System.currentTimeMillis();
+ if (this.isOptionalWriteEnabled)
+ {
+ user.setFirstname("Ben"+time);
+ }
+ // Don't forget to take the return value, this is basically a merge()
+ User userB = userDAO_B.findById(1l, false);
+ userB.setFirstname("Ben"+time);
+ emA.flush();
+ emB.flush();
+
+ emA.getSession().getTransaction().commit();
+ Assert.assertFalse(emA.isOpen());
+ Assert.assertFalse(emB.isOpen());
+ }
+ catch (HibernateException e) {
+ Assert.fail(e.getMessage());
+ }
+ catch (PersistenceException pe)
+ {
+ Assert.fail(pe.getMessage());
+ }
+ finally
+ {
+ }
+ }
+ /**
+ * Run the test sequentially.
+ *
+ * @param count
+ */
+ private void recurse(final int count)
+ {
+ for (int i = 0; i < count; i += 1)
+ {
+ try
+ {
+ task();
+ if (logger.isInfoEnabled())
+ {
+ logger.info("Executed profiled run of testbody.");
+ }
+ } catch (Exception e)
+ {
+ Assert.fail(e.getMessage(), e);
+ }
+ }
+ }
+
+ public EntityManagerFactory getEMFactoryA()
+ {
+ return this.emfA;
+ }
+
+ public EntityManagerFactory getEMFactoryB()
+ {
+ return this.emfB;
+ }
+
+ public class SessionSynchronization implements Synchronization
+ {
+ private final Logger logger = Logger.getLogger(SessionSynchronization.class);
+ private EntityManager manager;
+ private boolean closeAtTxCompletion;
+
+ public SessionSynchronization(EntityManager session, Transaction tx, boolean close)
+ {
+ this.manager = session;
+ closeAtTxCompletion = close;
+ }
+
+ public void beforeCompletion()
+ {
+ }
+
+ public void afterCompletion(int status)
+ {
+ if (closeAtTxCompletion)
+ {
+ logger.debug("************** closing entity managersession **************");
+ manager.close();
+ }
+ }
+ }
+
+}
More information about the jboss-svn-commits
mailing list