[
https://issues.apache.org/jira/browse/JCR-3173?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13268075#comment-13268075
]
Matthias Reischenbacher commented on JCR-3173:
----------------------------------------------
I've found a workaround. Vitali pointed me into the right direction. The
ItemManager caches the VersionHistory. If the version history is read after the
version history has been modified, no exception occurs, because the item state
manager always returns the same instance of the internal node state (stored in
the ChangeLog). If the version history is read before the modification, the
item manager stores a version history instance in its cache (with its own node
state). During the checkin operation the VersionHistory is copied (including
its internal node state, see also
InternalXAVersionManager.makeLocalCopy(InternalVersionHistoryImpl history)) and
all new versions are added as children of the new NodeState object. The
NodeState object of the version history inside the ItemManager is not updated,
leading to the already known exceptions. The workaround consists of removing
the version history from the item managers cache, before the checkin operation
is executed. Luckily there is a method which does just that (although I guess
it was not intended for this kind of usage). Please be aware that this is a
dirty hack:
// cast to jackrabbit impl
SessionImpl impl = (SessionImpl)session;
// read the version history one last time
VersionHistoryImpl versionHistoryImpl =
(VersionHistoryImpl)node.getVersionHistory();
// and now remove it from the item managers cache
impl.getItemManager().itemDestroyed(versionHistoryImpl.getId(), null);
// ready for checkin
Version version = node.checkin();
I actually wanted to provide a Patch which fixes this behavior directly inside
InternalXAVersionManager but I guess the xa version manager is not meant to
manipulate item manager internals like the caching mechanism. It would be
really nice if one of the jr committers could have a look at this issue,
because I think there is not much to do than placing the right two lines of
code at the right place.
> InvalidItemStateException if accessing VersionHistory before checkin()
> ----------------------------------------------------------------------
>
> Key: JCR-3173
> URL: https://issues.apache.org/jira/browse/JCR-3173
> Project: Jackrabbit Content Repository
> Issue Type: Bug
> Components: jackrabbit-core
> Affects Versions: 2.2.10
> Reporter: Matthias Reischenbacher
> Attachments: UserTransactionCheckinTest.java
>
>
> A checkin operation fails during a transaction if the VersionHistory of a
> node is accessed previously. See the attached test case for further details.
> -------------------------------------------------------------------------------
> Test set: org.apache.jackrabbit.core.version.UserTransactionCheckinTest
> -------------------------------------------------------------------------------
> Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 4.072 sec <<<
> FAILURE!
> testRestoreWithXA(org.apache.jackrabbit.core.version.UserTransactionCheckinTest)
> Time elapsed: 3.858 sec <<< ERROR!
> javax.jcr.InvalidItemStateException: Could not find child
> e77834ee-244c-441f-ab94-19847c769fa4 of node
> 03629609-8049-46ee-9e80-279c70b3a34d
> at
> org.apache.jackrabbit.core.ItemManager.getDefinition(ItemManager.java:207)
> at org.apache.jackrabbit.core.ItemData.getDefinition(ItemData.java:99)
> at org.apache.jackrabbit.core.ItemManager.canRead(ItemManager.java:421)
> at
> org.apache.jackrabbit.core.ItemManager.createItemData(ItemManager.java:843)
> at
> org.apache.jackrabbit.core.ItemManager.getItemData(ItemManager.java:391)
> at org.apache.jackrabbit.core.ItemManager.getItem(ItemManager.java:328)
> at org.apache.jackrabbit.core.ItemManager.getItem(ItemManager.java:622)
> at
> org.apache.jackrabbit.core.SessionImpl.getNodeById(SessionImpl.java:493)
> at
> org.apache.jackrabbit.core.VersionManagerImpl$1.perform(VersionManagerImpl.java:123)
> at
> org.apache.jackrabbit.core.VersionManagerImpl$1.perform(VersionManagerImpl.java:1)
> at
> org.apache.jackrabbit.core.session.SessionState.perform(SessionState.java:200)
> at
> org.apache.jackrabbit.core.VersionManagerImpl.perform(VersionManagerImpl.java:96)
> at
> org.apache.jackrabbit.core.VersionManagerImpl.checkin(VersionManagerImpl.java:115)
> at
> org.apache.jackrabbit.core.VersionManagerImpl.checkin(VersionManagerImpl.java:101)
> at org.apache.jackrabbit.core.NodeImpl.checkin(NodeImpl.java:2830)
> at
> org.apache.jackrabbit.core.version.UserTransactionCheckinTest.testRestoreWithXA(UserTransactionCheckinTest.java:35)
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira