[ 
https://issues.apache.org/jira/browse/JCR-1440?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Ryan Brush updated JCR-1440:
----------------------------

    Attachment: jcr-1440-workaround.patch

I ran into this issue in a similar situation.  Debugging in 
jackrabbit-core-1.4.2, I found that the InternalVersionHistoryImpl contains 
caches that were not aware of this update made by another node in the cluster.  
It's not clear to me how these caches are (or should be) synchronized, but I 
was able to work around the problem by adding the following logic to 
InternalVersionHistoryImpl#getVersion(NodeId):

* Run the existing logic to find the version in cache. 
* If the cached version is found, return it.
* If it is not found, invoke InternalVersionHistoryImpl#reload() to ensure 
newer changes to the repository are visible to the cache
* Attempt to get the item from cache again now that we've loaded the latest 
state

I don't know if this is an appropriate fix, or if there is some other 
workaround we might use.  However, this might shed some light on what is 
happening here.  I imagine the reload() operation can be expensive, but it 
shouldn't be called during a normal flow.

I'm also trying to better understand the threading model in Jackrabbit to 
ensure this mutation doesn't cause any race condition.


> NPE Thrown when two Cluster Nodes are hitting the same underlying database.
> ---------------------------------------------------------------------------
>
>                 Key: JCR-1440
>                 URL: https://issues.apache.org/jira/browse/JCR-1440
>             Project: Jackrabbit
>          Issue Type: Bug
>          Components: clustering, jackrabbit-core
>    Affects Versions: 1.4, core 1.4.1
>         Environment: Vista JDK 1.5.0_12.  Using Derby and Derby Client 
> 10.1.2.1
>            Reporter: Micah Whitacre
>            Priority: Critical
>         Attachments: jcr-1440-workaround.patch, repository1.xml, 
> SimpleJackrabbitConflictTest.java, SimpleJackRabbitTest.zip
>
>
> I've created a test that creates two repositories with clustering enabled 
> that are backed by the same database.  Using the following workflow causes a 
> NullPointerException to be thrown.
> The workflow I'm using is:
> The root node is versioned.
> ClusterNode1 creates a versioned child node named "foo".
> The test waits to make sure the syncDelay has passed so ClusterNode2 will 
> notice the newly created node.
> ClusterNode2 retrieves the "foo" child node and removes it.
> The test waits for the change ClusterNode1 to sync with that change.
> ClusterNode1 tries to create another new node however a NullPointerException 
> is thrown when the it tries to checkout the rootNode.
> java.lang.NullPointerException: null values not allowed
>       at 
> org.apache.commons.collections.map.AbstractReferenceMap.put(AbstractReferenceMap.java:251)
>       at 
> org.apache.jackrabbit.core.version.VersionManagerImpl.getItem(VersionManagerImpl.java:280)
>       at 
> org.apache.jackrabbit.core.version.XAVersionManager.getItem(XAVersionManager.java:334)
>       at 
> org.apache.jackrabbit.core.version.AbstractVersionManager.getVersion(AbstractVersionManager.java:87)
>       at 
> org.apache.jackrabbit.core.NodeImpl.getBaseVersion(NodeImpl.java:3198)
>       at org.apache.jackrabbit.core.NodeImpl.checkout(NodeImpl.java:2991)
>       at 
> com.cerner.system.configuration.repository.jcr.SimpleJackrabbitConflictTest.testNullPointerExceptionThrown(SimpleJackrabbitConflictTest.java:96)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to