jackrabbit-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Stefan Guggisberg (JIRA)" <j...@apache.org>
Subject [jira] Commented: (JCR-1554) StaleItemStateException with distributed transactions
Date Wed, 28 May 2008 15:19:45 GMT

    [ https://issues.apache.org/jira/browse/JCR-1554?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12600502#action_12600502

Stefan Guggisberg commented on JCR-1554:

> Stephane Landelle commented on JCR-1554:
> ----------------------------------------
> I have the same problem, and we won't ever be able to go in production with it...
> I have the feeling it comes from the Session being reused but its cache not being cleared
at the end of a transaction, when refresh(false) is called.
> It seems the bug dissapears when I add a itemMgr.dispose(); in SessionImpl.refresh :

i'm afraid that your proposed workaround would violate ItemManager's contract, see:

The ItemManager's responsabilities are:
guaranteeing that there aren't multiple instances representing the same Node or Property associated
with the same Session instance.

your proposed change could lead to multiple Node or Property instances per session representing
the same item.
this would cause serious consistency issues.

-1 for the proposed change.

> public void refresh(boolean keepChanges) throws RepositoryException {
>        // check sanity of this session
>        sanityCheck();
>        if (!keepChanges) {
>            // optimization
>            itemStateMgr.disposeAllTransientItemStates();
>            itemMgr.dispose();
>            return;
>        }
>        itemMgr.getRootNode().refresh(keepChanges);
>  }
> I'm not sure of the impact of this change, so could somebody of Jackrabbit have a look
at it, please?

> StaleItemStateException with distributed transactions
> -----------------------------------------------------
>                 Key: JCR-1554
>                 URL: https://issues.apache.org/jira/browse/JCR-1554
>             Project: Jackrabbit
>          Issue Type: Bug
>          Components: transactions
>    Affects Versions: 1.4, core 1.4.2
>         Environment: WinXP, jdk1.5.0_14, jboss_4.2.2.GA, jackrabbit 1.4.2, spring 2.5.3,
spring-modules-jcr 0.8 (for integration of jackrabbit with spring)
> PM of repository: OraclePersistenceManager; DB: Oracle
>            Reporter: Sven Rieckhoff
>         Attachments: jackrabbit-tx-bug.zip
> There seams to be a serious bug in jackrabbit when used in distributed transactions.
It does not occur with local transactions! And it seams to be related to JCR-566.
> There are 2 scenarios where a StaleItemStateException occurs reproducible that causes
transactions to fail. All my operations (implemented in a custom ServiceBean) such as setProperty()
or deleteNode() run in separate transactions. The transactions are configured through Spring
Annotations (@Transactional).
> Scenario A (setProperty):
> (1) multiple setProperty() with same property name on the same node (newly created or
already existent)
> => With the 3. setProperty() (and sometimes also the 5.), a StaleItemStateException
for the property state is raised when the transaction is commited. Following setProperty invocations
will not fail!
> Scenario B (deleteNode):
> (1) iterate 10 times:
> (1.1) create new node n and a subnode for n
> (1.2) delete node n
> => Deletion of node n raises a StaleItemStateException for node n in iteration 1,
3 and (6 or 7), when the related transaction is commited. Following deletions of node n will
also fail with a predictable pattern.
> The Exception trace for scenario A (it's the same for scenario B, with one difference:
StaleItemStateException is raised for the node and not for the property):
> org.springframework.transaction.UnexpectedRollbackException: JTA transaction unexpectedly
rolled back (maybe due to a timeout); nested exception is javax.transaction.RollbackException:
Error during one-phase commit
> 	at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1031)
> 	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:709)
> 	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:678)
> 	at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321)
> 	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
> 	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
> 	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
> 	at $Proxy9.setNodeProperty(Unknown Source)
> 	at de.zeb.control.prototype.jrTxBug.test.TestJackrabbitTxBug.testTransactionBug001(TestJackrabbitTxBug.java:97)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> 	at java.lang.reflect.Method.invoke(Method.java:585)
> 	at org.testng.internal.MethodHelper.invokeMethod(MethodHelper.java:580)
> 	at org.testng.internal.Invoker.invokeMethod(Invoker.java:478)
> 	at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:607)
> 	at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:874)
> 	at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
> 	at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
> 	at org.testng.TestRunner.runWorkers(TestRunner.java:689)
> 	at org.testng.TestRunner.privateRun(TestRunner.java:566)
> 	at org.testng.TestRunner.run(TestRunner.java:466)
> 	at org.testng.SuiteRunner.runTest(SuiteRunner.java:301)
> 	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:296)
> 	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:276)
> 	at org.testng.SuiteRunner.run(SuiteRunner.java:191)
> 	at org.testng.TestNG.createAndRunSuiteRunners(TestNG.java:808)
> 	at org.testng.TestNG.runSuitesLocally(TestNG.java:776)
> 	at org.testng.TestNG.run(TestNG.java:701)
> 	at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:73)
> 	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:124)
> Caused by: javax.transaction.RollbackException: Error during one-phase commit
> 	at org.apache.geronimo.transaction.manager.TransactionImpl.commit(TransactionImpl.java:281)
> 	at org.apache.geronimo.transaction.manager.TransactionManagerImpl.commit(TransactionManagerImpl.java:143)
> 	at org.apache.geronimo.transaction.context.InheritableTransactionContext.complete(InheritableTransactionContext.java:196)
> 	at org.apache.geronimo.transaction.context.InheritableTransactionContext.commit(InheritableTransactionContext.java:146)
> 	at org.apache.geronimo.transaction.context.OnlineUserTransaction.commit(OnlineUserTransaction.java:80)
> 	at org.jencks.factory.UserTransactionFactoryBean$GeronimoUserTransaction.commit(UserTransactionFactoryBean.java:118)
> 	at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1028)
> 	... 30 more
> Caused by: javax.transaction.xa.XAException
> 	at org.apache.jackrabbit.core.TransactionContext.prepare(TransactionContext.java:155)
> 	at org.apache.jackrabbit.core.XASessionImpl.commit(XASessionImpl.java:337)
> 	at org.apache.jackrabbit.jca.TransactionBoundXAResource.commit(TransactionBoundXAResource.java:39)
> 	at org.apache.geronimo.transaction.manager.WrapperNamedXAResource.commit(WrapperNamedXAResource.java:47)
> 	at org.apache.geronimo.transaction.manager.TransactionImpl.commit(TransactionImpl.java:272)
> 	... 36 more
> Caused by: org.apache.jackrabbit.core.TransactionException: Unable to prepare transaction.
> 	at org.apache.jackrabbit.core.state.XAItemStateManager.prepare(XAItemStateManager.java:150)
> 	at org.apache.jackrabbit.core.TransactionContext.prepare(TransactionContext.java:138)
> 	... 40 more
> Caused by: org.apache.jackrabbit.core.state.StaleItemStateException: bef3c056-bc91-4195-a35c-aa184182b5ad/{}TEST_PROPERTY
has been modified externally
> 	at org.apache.jackrabbit.core.state.SharedItemStateManager$Update.begin(SharedItemStateManager.java:620)
> 	at org.apache.jackrabbit.core.state.SharedItemStateManager.beginUpdate(SharedItemStateManager.java:843)
> 	at org.apache.jackrabbit.core.state.XAItemStateManager.prepare(XAItemStateManager.java:144)
> 	... 41 more
> When debugging into jackrabbit you will see, that the cause of the StaleItemStateException
is, that the local state und the overlayed state differ in the value of the 'modCount' attribute:
modCount of local state is lower than modCount of overlayed state. Perhaps its a state caching
> I'm attaching a simple java application configured with maven and ready to run standalone.
The JCA container of JBoss is therefore replaced with jencks in order to support distributed
transactions. The configured repository uses the InMemPersistenceManager. Both scenarios are
implemented in a TestNG - test, that catches the occuring TransactionExceptions and prints
out the stacktrace. Therefore you will see the exceptions, but the tests will not fail.

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

View raw message