jackrabbit-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Stefan Guggisberg <stefan.guggisb...@gmail.com>
Subject Re: concurrency problem
Date Fri, 19 Aug 2005 16:44:21 GMT
On 8/11/05, Stefan Guggisberg <stefan.guggisberg@gmail.com> wrote:
> On 8/11/05, Walter Raboch <wraboch@ingen.at> wrote:
> > Hi Stefan,
> >
> > >>Thanks for the discussion. Now I unterstand jackrabbits way of doing.
> > >>But in my opinion adding child nodes should not alter the parent node
> > >>itself. Just changing some properties is a state change.
> > >
> > > i don't agree. see 7.1.4 Adding Nodes in the jsr 170 spec:
> > > <quote>
> > > In order to save a newly added node, save must be called either on the
> > > Session, or on the new node's parent or higher-order ancestor
> > > (grandparent, etc.).
> > > </quote>
> > >>Furthermore there should be an error just in the case, that both updates
> > >>overwrite the changes of the other -> to prevent lost update problems.
> > >>In my example code it´s not the case, so I would prefer no error at all.
> > >>What do you think?
> > >
> > > AFAIK lost updates did never happen. your testcase failed in the right
> > > situations
> > > but threw the wrong exceptions. i committed a fix for that problem yesterday.
> > > IMO it now works as it should according to the jsr 170 spec.
> >
> > You are right according to the spec. Let me try to explain my thoughts:
> >
> > s0: read root node
> > s1: read root node
> > s0: add or remove child "c1"
> > s1: add or remove child "c2"
> > s0: rn.save()
> > s1: rn.save()
> >
> > All this without error. Because the changes of both sessions dont
> > interfere.
> 
> i can see what you mean. unfortunately there's no trivial solution.
> child node additions & removals per se are not guaranteed to
> be non-interfering. there's even a great chance that they actually
> *are* interfering. just think of same-name siblings. the same applies
> for child re-ordering.
> 
> an application should lock the parent node to stay clear of such
> concurrency issues (pessimistic locking approach).
> 
> > If both sessions change the same child or attribute, there should be
> > thrown an InvalidItemStateException.
> >
> > s0: read root node
> > s1: read root node
> > s0: set property p="hello"
> > s1: set property p="world"
> > s0: save
> > s1: save -> InvalidItemStateException
> >
> > What do you think?
> >
> > To our first problem with my testcase. I rerun the code but it still
> > fails with ItemNotFoundExceptions. But I dont know why.
> 
> the first InvalidItemStateException is correct.
> i'll investigate the ItemNotFoundException. i guess there's
> a 'synchronized' missing somewhere...

this issue should be fixed now (r233511).

cheers
stefan

> 
> cheers
> stefan
> 
> >
> > cheers, Walter
> > --
> > Output of rerun (revision 231423):
> > ==================================
> > s0: started.
> > s1: started.
> > s2: started.
> > s3: started.
> > s4: started.
> > s3: Exception: removing testnode
> > javax.jcr.InvalidItemStateException: /: the item cannot be saved because
> > it has been modified externally.
> >         at
> > org.apache.jackrabbit.core.ItemImpl.getTransientStates(ItemImpl.java:347)
> >         at org.apache.jackrabbit.core.ItemImpl.save(ItemImpl.java:1205)
> >         at org.apache.jackrabbit.core.SessionImpl.save(SessionImpl.java:747)
> >         at TestSession.run(TestSession.java:62)
> >         at java.lang.Thread.run(Unknown Source)
> > s3: ended.
> > javax.jcr.ItemNotFoundException: 545ab69b-0297-427c-a05a-217e3c8f7d88
> >         at
> > org.apache.jackrabbit.core.ItemManager.createItemInstance(ItemManager.java:498)
> >         at org.apache.jackrabbit.core.ItemManager.getItem(ItemManager.java:349)
> >         at
> > org.apache.jackrabbit.core.NodeImpl.internalAddChildNode(NodeImpl.java:781)
> >         at org.apache.jackrabbit.core.NodeImpl.internalAddNode(NodeImpl.java:725)
> >         at org.apache.jackrabbit.core.NodeImpl.internalAddNode(NodeImpl.java:672)
> >         at org.apache.jackrabbit.core.NodeImpl.addNode(NodeImpl.java:1721)
> >         at TestSession.run(TestSession.java:70)
> >         at java.lang.Thread.run(Unknown Source)
> > s0: Exception: adding testnode
> > s0: ended.
> > s4: Exception: removing testnode
> > javax.jcr.InvalidItemStateException: /: the item cannot be saved because
> > it has been modified externally.
> >         at
> > org.apache.jackrabbit.core.ItemImpl.getTransientStates(ItemImpl.java:347)
> >         at org.apache.jackrabbit.core.ItemImpl.save(ItemImpl.java:1205)
> >         at org.apache.jackrabbit.core.SessionImpl.save(SessionImpl.java:747)
> >         at TestSession.run(TestSession.java:62)
> >         at java.lang.Thread.run(Unknown Source)
> > s4: ended.
> > s1: Exception: adding testnode
> > javax.jcr.ItemNotFoundException: e170d490-b7c1-4dfa-be14-f8932162b9f7
> >         at
> > org.apache.jackrabbit.core.ItemManager.createItemInstance(ItemManager.java:498)
> >         at org.apache.jackrabbit.core.ItemManager.getItem(ItemManager.java:349)
> >         at
> > org.apache.jackrabbit.core.NodeImpl.internalAddChildNode(NodeImpl.java:781)
> >         at org.apache.jackrabbit.core.NodeImpl.internalAddNode(NodeImpl.java:725)
> >         at org.apache.jackrabbit.core.NodeImpl.internalAddNode(NodeImpl.java:672)
> >         at org.apache.jackrabbit.core.NodeImpl.addNode(NodeImpl.java:1721)
> >         at TestSession.run(TestSession.java:70)
> >         at java.lang.Thread.run(Unknown Source)
> > s1: ended.
> > ..........s2: ended.
> >
> >
> >
>

Mime
View raw message