[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