[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