[
https://issues.apache.org/jira/browse/JCR-962?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12508104
]
Marcel Reutegger commented on JCR-962:
--------------------------------------
Added Bertrands' test case and created a new test suite, which contains all
long running tests related to multi-threading: MultiThreadingTests. The suite
will not run with the regression test while building jackrabbit-core but can
easily be started in an IDE.
> Deadlocks in ConcurrentVersioningWithTransactionsTest
> -----------------------------------------------------
>
> Key: JCR-962
> URL: https://issues.apache.org/jira/browse/JCR-962
> Project: Jackrabbit
> Issue Type: Bug
> Components: core
> Reporter: Bertrand Delacretaz
> Attachments: 10-threads-dump.txt, 100-threads-dump.txt,
> deadlocked-threads.txt, JCR-962-ConcurrentVersioningWithTransactionsTest.patch
>
>
> Patch follows for a ConcurrentVersioningWithTransactionsTest, based on the
> existing ConcurrentVersioningTest but using transactions around the
> versioning operations.
> On my macbook, running the test with CONCURRENCY = 100 and NUM_OPERATIONS =
> 100 causes a deadlock after a few seconds, thread dumps follow.
> Note that I had to ignore StaleItemStateException (which is probably
> justified, due to not locking stuff IIUC) to let the threads run long enough
> to show the problem.
> Running the test a few times showed the same locking pattern several times:
> some threads are locked at line 87 (session.save(), no transaction) while
> others are at line 93 (transaction.commit()), in
> testConcurrentCheckinInTransaction():
> 80 public void testConcurrentCheckinInTransaction() throws
> RepositoryException {
> 81 runTask(new Task() {
> 82 public void execute(Session session, Node test) throws
> RepositoryException {
> 83 int i = 0;
> 84 try {
> 85 Node n = test.addNode("test");
> 86 n.addMixin(mixVersionable);
> 87 session.save();
> 88 for (i = 0; i < NUM_OPERATIONS / CONCURRENCY; i++) {
> 89 final UserTransaction utx = new
> UserTransactionImpl(test.getSession());
> 90 utx.begin();
> 91 n.checkout();
> 92 n.checkin();
> 93 utx.commit();
> 94 }
> 95 n.checkout();
> 96 } catch (Exception e) {
> 97 final String threadName = Thread.currentThread().getName();
> 98 final Throwable deepCause = getLevel2Cause(e);
> 99 if(deepCause!=null && deepCause instanceof
> StaleItemStateException) {
> 100 // ignore
> 101 } else {
> 102 throw new RepositoryException(threadName + ", i=" + i +
> ":" + e.getClass().getName(), e);
> 103 }
> 104 }
> 105 }
> 106 }, CONCURRENCY);
> 107 }
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.