jackrabbit-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Walter Raboch <wrab...@ingen.at>
Subject Re: concurrency problem
Date Thu, 11 Aug 2005 11:45:54 GMT
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.
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.

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
  • Unnamed multipart/mixed (inline, None, 0 bytes)
View raw message