Heya, I think I'm probably doing something pretty stupid here, but I'm having a few problems using Jackrabbit in a multithreaded environment. If you can imagine I have this scenario:

Thread #1 running inside my unit test which is doing stuff to the repository all in one session. Thread #2 which is reading stuff inside the repository and updating some nodes

I think occasionally these threads collide though and start modifying the same node. Then I starting getting things like:

javax.jcr.RepositoryException: failed to create transient state: there's already a property state instance with id 1d038015-6c48-4654-a685-1dcf57a6bf6f/{http://www.jcp.org/jcr/1.0}mixinTypes: there's already a property state instance with id 1d038015-6c48-4654-a685-1dcf57a6bf6f/{http://www.jcp.org/jcr/1.0}mixinTypes at org.apache.jackrabbit.core.PropertyImpl.getOrCreateTransientItemState(PropertyImpl.java:97) at org.apache.jackrabbit.core.PropertyImpl.restoreTransient(PropertyImpl.java:143) at org.apache.jackrabbit.core.ItemImpl.restoreTransientItems(ItemImpl.java:734)
   at org.apache.jackrabbit.core.ItemImpl.save(ItemImpl.java:1233)
   at org.apache.jackrabbit.core.SessionImpl.save(SessionImpl.java:849)
...
Caused by: org.apache.jackrabbit.core.state.ItemStateException: there's already a property state instance with id 1d038015-6c48-4654-a685-1dcf57a6bf6f/{http://www.jcp.org/jcr/1.0}mixinTypes at org.apache.jackrabbit.core.state.SessionItemStateManager.createTransientPropertyState(SessionItemStateManager.java:629) at org.apache.jackrabbit.core.PropertyImpl.getOrCreateTransientItemState(PropertyImpl.java:90)
   ... 42 more

Or:

javax.jcr.RepositoryException: failed to create transient state: there's already a property state instance with id 1d038015-6c48-4654-a685-1dcf57a6bf6f/{http://www.jcp.org/jcr/1.0}uuid: there's already a property state instance with id 1d038015-6c48-4654-a685-1dcf57a6bf6f/{http://www.jcp.org/jcr/1.0}uuid at org.apache.jackrabbit.core.PropertyImpl.getOrCreateTransientItemState(PropertyImpl.java:97) at org.apache.jackrabbit.core.PropertyImpl.restoreTransient(PropertyImpl.java:143) at org.apache.jackrabbit.core.ItemImpl.restoreTransientItems(ItemImpl.java:734)
   at org.apache.jackrabbit.core.ItemImpl.save(ItemImpl.java:1233)
   at org.apache.jackrabbit.core.SessionImpl.save(SessionImpl.java:849)
....
Caused by: org.apache.jackrabbit.core.state.ItemStateException: there's already a property state instance with id 1d038015-6c48-4654-a685-1dcf57a6bf6f/{http://www.jcp.org/jcr/1.0}uuid at org.apache.jackrabbit.core.state.SessionItemStateManager.createTransientPropertyState(SessionItemStateManager.java:629) at org.apache.jackrabbit.core.PropertyImpl.getOrCreateTransientItemState(PropertyImpl.java:90)
   ... 42 more

If the second thread was accessing a node created by the first thread and the node wasn't saved yet, would that explain these errors?

Any ideas how to avoid this???

- Dan

--
Dan Diephouse
MuleSource
http://mulesource.com | http://netzooid.com/blog

Reply via email to