[jboss-svn-commits] JBL Code SVN: r32948 - in labs/jbossrules/trunk/drools-repository/src: test/java/org/drools/repository and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed May 19 04:34:06 EDT 2010


Author: jervisliu
Date: 2010-05-19 04:34:06 -0400 (Wed, 19 May 2010)
New Revision: 32948

Modified:
   labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RepositorySessionUtil.java
   labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RulesRepositoryTest.java
Log:
fix failed test : multi-threaded test caused jackrabbit db crash

Modified: labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RepositorySessionUtil.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RepositorySessionUtil.java	2010-05-19 03:26:46 UTC (rev 32947)
+++ labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RepositorySessionUtil.java	2010-05-19 08:34:06 UTC (rev 32948)
@@ -5,8 +5,9 @@
 import javax.jcr.Repository;
 import javax.jcr.Session;
 import javax.jcr.SimpleCredentials;
+import javax.jcr.LoginException;
+import javax.jcr.RepositoryException;
 
-
 /**
  * This is a utility to simulate session behavior for the test suite.
  * @author Michael Neale
@@ -15,6 +16,7 @@
 public class RepositorySessionUtil {
 
     private static ThreadLocal<RulesRepository> repo = new ThreadLocal<RulesRepository>();
+    private static Repository multiThreadedRepository;
 
 //    private static final Logger log = Logger.getLogger( RepositorySessionUtil.class );
 
@@ -49,12 +51,12 @@
             JCRRepositoryConfigurator config = new JackrabbitRepositoryConfigurator();
 
             //create a repo instance (startup)
-            Repository repository = config.getJCRRepository(null);
+            multiThreadedRepository = config.getJCRRepository(null);
 
             //create a session
             Session session;
             try {
-                session = repository.login(new SimpleCredentials("alan_parsons", "password".toCharArray()));
+                session = multiThreadedRepository.login(new SimpleCredentials("alan_parsons", "password".toCharArray()));
                 RulesRepositoryAdministrator admin = new RulesRepositoryAdministrator(session);
 
                 //clear out and setup
@@ -64,7 +66,7 @@
                 config.setupRulesRepository( session );
                 repoInstance = new RulesRepository( session );
 
-                repository.login(new SimpleCredentials("ADMINISTRATOR", "password".toCharArray()));
+                multiThreadedRepository.login(new SimpleCredentials("ADMINISTRATOR", "password".toCharArray()));
                 //loonie hack
                 //DroolsRepositoryAccessManager.adminThreadlocal.set(  adminSession );
                 repo.set( repoInstance );
@@ -76,4 +78,53 @@
         return repoInstance;
     }
 
+   public static synchronized RulesRepository getMultiThreadedRepository() throws RulesRepositoryException {
+       if ( multiThreadedRepository == null ) {
+                     //System.out.println("----------repoInstance == null");
+
+           File dir = new File( "repository" );
+           System.out.println( "DELETING test repo: " + dir.getAbsolutePath() );
+           deleteDir( dir );
+           System.out.println( "TEST repo was deleted." );
+
+           JCRRepositoryConfigurator config = new JackrabbitRepositoryConfigurator();
+
+           //create a repo instance (startup)
+           multiThreadedRepository = config.getJCRRepository(null);
+
+           //create a session to config repo
+           Session session;
+           try {
+               session = multiThreadedRepository.login(new SimpleCredentials("alan_parsons", "password".toCharArray()));
+               RulesRepositoryAdministrator admin = new RulesRepositoryAdministrator(session);
+
+               //clear out and setup
+               if (admin.isRepositoryInitialized()) {
+                   admin.clearRulesRepository();
+               }
+               config.setupRulesRepository( session );
+           } catch ( Exception e) {
+               throw new RulesRepositoryException(e);
+           }
+       }
+
+
+       //associate this repo instance with thread specific sessions every time.
+       Session session;
+       try {
+           session = multiThreadedRepository.login(new SimpleCredentials("alan_parsons", "password".toCharArray()));
+           RulesRepository threadLocalRepo = new RulesRepository( session );
+           return threadLocalRepo;
+       } catch (LoginException e) {
+           // TODO Auto-generated catch block
+           e.printStackTrace();
+       } catch (RepositoryException e) {
+           // TODO Auto-generated catch block
+           e.printStackTrace();
+       }
+             return null;
+   }
+
+
+
 }

Modified: labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RulesRepositoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RulesRepositoryTest.java	2010-05-19 03:26:46 UTC (rev 32947)
+++ labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RulesRepositoryTest.java	2010-05-19 08:34:06 UTC (rev 32948)
@@ -1160,120 +1160,79 @@
 	}
 	
 	//In this test case we expect an ItemExistException from the second thread,
-    //other than ending up with two packages with same name.
+        //other than ending up with two packages with same name.
 	//https://jira.jboss.org/jira/browse/GUVNOR-346
-	public void xtestConcurrentCopyPackage() throws Exception {
-		//We have to handle how to get an instance of RulesRepository,
-		//by ourself, as different threads need to use different sessions.
-		final Repository repository;
+    public void testConcurrentCopyPackage() throws Exception {
+       // set up testing data               
+       RulesRepository repo = RepositorySessionUtil.getMultiThreadedRepository();
+       PackageItem source = repo.createPackage("testConcurrentCopyPackage",
+               "asset");
+       AssetItem item = source.addAsset("testCopyPackage", "desc");
+       item.updateContent("la");
+       item.checkin("");
+       repo.save();
 
-		File dir = new File("repository");
-		System.out.println("DELETING test repo: " + dir.getAbsolutePath());
-		deleteDir(dir);
-		System.out.println("TEST repo was deleted.");
+       int NUM_ITERATIONS = 40;
+       int NUM_SESSIONS = 2;
+              for (int n = 0; n < NUM_ITERATIONS; n++) {
+           Node folderNode = repo.getAreaNode(RulesRepository.RULE_PACKAGE_AREA);
+                      // cleanup
+           while (folderNode.hasNode("testConcurrentCopyPackage2")) {
+               folderNode.getNode("testConcurrentCopyPackage2").remove();
+               repo.save();
+           }
 
-		JCRRepositoryConfigurator config = new JackrabbitRepositoryConfigurator();
+           Thread[] threads = new Thread[NUM_SESSIONS];
+           for (int i = 0; i < threads.length; i++) {
+               String id = "session#" + i;
+               ConcurrentCopySession ts = new ConcurrentCopySession(id);
+               Thread t = new Thread(ts);
+               t.setName(id);
+               t.start();
+               threads[i] = t;
+           }
+           for (int i = 0; i < threads.length; i++) {
+               threads[i].join();
+           }
 
-		repository = new TransientRepository("/repository.xml", "tmpdir");
-		//repository = config.getJCRRepository("tmpdir");
-		Session session = repository.login(new SimpleCredentials("alan_parsons",
-				"password".toCharArray()));
-		RulesRepositoryAdministrator admin = new RulesRepositoryAdministrator(
-				session);
+           //Node folderNode = repo.getAreaNode(RulesRepository.RULE_PACKAGE_AREA);
+           NodeIterator results = folderNode.getNodes("testConcurrentCopyPackage2");
+           assertEquals(1, results.getSize());
+       }        }
 
-		// clear out and setup
-		if (admin.isRepositoryInitialized()) {
-			admin.clearRulesRepository();
-		}
-		config.setupRulesRepository(session);
-		RulesRepository repo = new RulesRepository(session);
+      class ConcurrentCopySession implements Runnable {
+       String identity;
+       Random r;
+       RulesRepository localRepo;
+              ConcurrentCopySession(String identity) {
+           this.identity = identity;
+           r = new Random();
+           localRepo = RepositorySessionUtil.getMultiThreadedRepository();
+       }
 
-		// set up testing data
-		PackageItem source = repo.createPackage("testConcurrentCopyPackage",
-				"asset");
-		AssetItem item = source.addAsset("testCopyPackage", "desc");
-		item.updateContent("la");
-		item.checkin("");
-		repo.save();
+       private void randomSleep() {
+           long l = r.nextInt(90) + 20;
+           try {
+               Thread.sleep(l);
+           } catch (InterruptedException ie) {
+           }
+       }
 
-	    int NUM_ITERATIONS = 40;
-	    int NUM_SESSIONS = 2;
-	    
-        for (int n = 0; n < NUM_ITERATIONS; n++) {
-    		Node folderNode = repo.getAreaNode(RulesRepository.RULE_PACKAGE_AREA);
-        	
-            // cleanup
-            while (folderNode.hasNode("testConcurrentCopyPackage2")) {
-            	folderNode.getNode("testConcurrentCopyPackage2").remove();
-            	repo.save();
-            }
+       public void run() {
+           try {
+               //This returns different repository instances for different threads
+               localRepo.copyPackage("testConcurrentCopyPackage",
+                       "testConcurrentCopyPackage2");
+               PackageItem dest = localRepo
+                       .loadPackage("testConcurrentCopyPackage2");
+               assertNotNull(dest);
+               randomSleep();                       } catch (RulesRepositoryException rre) {
+               //expected
+           } finally {
+           }
+       }
+   }
 
-            Thread[] threads = new Thread[NUM_SESSIONS];
-            for (int i = 0; i < threads.length; i++) {
-                String id = "session#" + i;
-                ConcurrentCopySession ts = new ConcurrentCopySession(id, repository);
-                Thread t = new Thread(ts);
-                t.setName(id);
-                t.start();
-                threads[i] = t;
-            }
-            for (int i = 0; i < threads.length; i++) {
-                threads[i].join();
-            }
-
-    		//Node folderNode = repo.getAreaNode(RulesRepository.RULE_PACKAGE_AREA);
-    		NodeIterator results = folderNode.getNodes("testConcurrentCopyPackage2");
-    		assertEquals(1, results.getSize());
-        }     
-	}
-	
-    class ConcurrentCopySession implements Runnable {
-        String identity;
-        Random r;
-        Repository repository;
-
-        ConcurrentCopySession(String identity, Repository repository) {
-        	this.repository = repository;
-            this.identity = identity;
-            r = new Random();
-        }
-
-        private void randomSleep() {
-            long l = r.nextInt(90) + 20;
-            try {
-                Thread.sleep(l);
-            } catch (InterruptedException ie) {
-            }
-        }
-
-        public void run() {
-			try {
-				Session localSession = repository.login(new SimpleCredentials("admin", "admin"
-								.toCharArray()));
-				RulesRepository repo1 = new RulesRepository(
-						localSession);
-
-				repo1.copyPackage("testConcurrentCopyPackage",
-						"testConcurrentCopyPackage2");
-				PackageItem dest = repo1
-						.loadPackage("testConcurrentCopyPackage2");
-				assertNotNull(dest);
-				randomSleep();
-			} catch (LoginException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
-				fail();
-			} catch (RepositoryException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
-				fail();
-			} catch (RulesRepositoryException rre) {
-				//expected
-			} finally {
-			}
-        }
-    }
-
     private static boolean deleteDir(File dir) {
 
         if (dir.isDirectory()) {



More information about the jboss-svn-commits mailing list