[ 
https://issues.apache.org/jira/browse/JCR-962?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Bertrand Delacretaz updated JCR-962:
------------------------------------

    Attachment: 10-threads-dump.txt

Deadlocked threads dump with 10 concurrent tasks

> 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, 
> 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.

Reply via email to