[ https://issues.apache.org/jira/browse/JCR-1359?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Stefan Guggisberg resolved JCR-1359. ------------------------------------ Resolution: Fixed fixed in r634681 > Adding nodes from concurrently running sessions cause exceptions > ---------------------------------------------------------------- > > Key: JCR-1359 > URL: https://issues.apache.org/jira/browse/JCR-1359 > Project: Jackrabbit > Issue Type: Bug > Components: jackrabbit-core > Affects Versions: 1.3.3, 1.4, core 1.4.1 > Reporter: Alexander Nesterov > Assignee: Stefan Guggisberg > Priority: Critical > Fix For: core 1.4.2 > > > Exceptions are thrown when trying to add child nodes to one parent node from > different sessions running concurrently. One of the following exceptions is > always thrown: > * Exception in thread "Thread-8" java.lang.RuntimeException: > javax.jcr.nodetype.ConstraintViolationException: /A/7 needs to be saved as > well. > * Exception in thread "Thread-8" java.lang.RuntimeException: > javax.jcr.RepositoryException: /A: unable to update item.: Unable to > resolve path for item: > 016b885a-64aa-45b9-a990-05cbabb4586f/{http://www.jcp.org/jcr/1.0}primaryType: > Unable to resolve path for item: > 016b885a-64aa-45b9-a990-05cbabb4586f/{http://www.jcp.org/jcr/1.0}primaryType > According to JCR-584 "Improve handling of concurrent node modifications" the > following scenario "session 1 adds or removes child node 'x', session 2 adds > or removes child node 'y'" should run gracefully, but the following test > constantly fails: > public void testSync() throws Exception > { > Node rootNode = getSession ().getRootNode (); > rootNode.addNode ("A"); > rootNode.save(); > final Session session1 = getRepository().login (new SimpleCredentials > ("userName", "password".toCharArray())); > final Session session2 = getRepository().login (new SimpleCredentials > ("userName", "password".toCharArray())); > Thread thread1 = new Thread (new Runnable() > { > public void run() > { > try > { > addNodes ("A", session1, 0); > } > catch (RepositoryException ex) > { > throw new RuntimeException (ex); > } > } > }); > Thread thread2 = new Thread (new Runnable() > { > public void run() > { > try > { > addNodes ("A", session2, 1001); > } > catch (RepositoryException ex) > { > throw new RuntimeException (ex); > } > } > }); > thread1.start(); > thread2.start(); > thread1.join(); > thread2.join(); > } > private void addNodes (String parentName, Session session, int startIndex) > throws RepositoryException > { > Node parentNode = session.getRootNode().getNode (parentName); > for (int i = startIndex; i < startIndex + 100; i++) > { > String name = Integer.toString (i); > parentNode.addNode (name); > parentNode.save(); > } > } > BTW: exceptions were also thrown when I tried to add nodes from one thread > and remove some of them from another one. Each thread used it's own session, > each node had unique name. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.