On 1 Apr 2010, at 02:55, Norman Maurer wrote:

> Hi Ian,
> 
> I'm 100 % sure the session is not shared.
> 
> About your (2).. I thought It should be no problem to add child nodes
> in a multi-threading app if the name silbing of the childs are unique.
> I'm wrong ?

The problem here is deep under the covers child nodes are stored in an array 
that has to be re-written when updated. So if you add a child node the entire 
contents of the array is re-written, making it impossible to perform an 
optimistic merge of concurrent changes.

You can concurrently modify individual child nodes, or separate properties, but 
you cant concurrently add multiple child nodes to a parent node. There is 
discussion on d...@jackrabbit about how JR3 will address this issue.

Ian

BTW, anyone, if I got that wrong, please correct, I dont want to spread 
misinformation by mistake.


> 
> I will have a look at the code you posted later today..
> 
> 
> Thx,
> Norman
> 
> 
> 2010/3/31 Ian Boston <[email protected]>:
>> There are a number of causes if its under heavy load:
>> 
>> 1. Multiple threads (mistakenly) sharing the same session.
>> 2. Multiple threads adding a child node the same parent node at exactly the 
>> same time, although this might also show up as a failure to merge a 
>> modification.
>> 
>> If operating in a cluster you may find that events from modifications on 
>> other nodes result in the same problem as the state of the local shared 
>> cache changes in reaction to events from other nodes.
>> 
>> One solution is to maintain an application level, in memory lock on the 
>> parent node to prevent concurrent modifications on the same parent node in 
>> JVM (although this doesn't solve the cluster problem). eg [1]
>> 
>> A better strategy is to use a retry mechanism even propagating to the client 
>> with a suitable response code. (eg in http  409)
>> 
>> Ian
>> 
>> 1. 
>> http://github.com/ieb/open-experiments/blob/master/slingtests/osgikernel/bundles/locking/src/main/java/org/sakaiproject/nakamura/locking/LockManagerImpl.java
>> 
>> On 30 Mar 2010, at 10:07, Norman Maurer wrote:
>> 
>>> Hi all,
>>> 
>>> I have an application which use many threads. Sometimes I see this
>>> error on heavy load:
>>> 
>>> javax.jcr.InvalidItemStateException: Item cannot be saved because it
>>> has been modified externally: node /
>>> 
>>> I wonder how this can happen because I don't add a Node directly to
>>> the rootNode add this time..
>>> 
>>> Is it maybe related to :
>>> https://issues.apache.org/jira/browse/JCR-2428
>>> 
>>> I'm using Jackrabbit 2.0.0 without transactions..
>>> 
>>> Bye,
>>> Norman
>> 
>> 

Reply via email to