You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@jackrabbit.apache.org by Roman Puchkovskiy <ro...@blandware.com> on 2008/05/09 15:31:39 UTC

Problem when trying to reuse version label in transaction

Hi.

There's a problem with reusage of version label. If version (which has label
assigned) is removed inside a transaction, and after this same label is
tried to be assigned to another version (in same transaction), exception is
thrown.

Maven project with test case is here:
http://rpuch.narod.ru/test-reassign-version-label-in-tx.zip
When you run 'mvn test', test using transaction fails, following exception
is thrown:

org.springframework.dao.DataIntegrityViolationException: Invalid version
graph operation; nested exception is javax.jcr.version.VersionException:
State has been marked destroyed: 8d73b533-a938-4795-96f6-9fd263d73569/{}2:
State has been marked destroyed: 8d73b533-a938-4795-96f6-9fd263d73569/{}2:
State has been marked destroyed: 8d73b533-a938-4795-96f6-9fd263d73569/{}2
	at
org.springmodules.jcr.SessionFactoryUtils.translateException(SessionFactoryUtils.java:230)
	at
org.springmodules.jcr.JcrAccessor.convertJcrAccessException(JcrAccessor.java:58)
	at org.springmodules.jcr.JcrTemplate.execute(JcrTemplate.java:82)
	at org.springmodules.jcr.JcrTemplate.execute(JcrTemplate.java:108)
	at
ReassignVersionLabelInTxTest$3.doInTransaction(ReassignVersionLabelInTxTest.java:91)
	at
org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:128)
	at
ReassignVersionLabelInTxTest.testReassignVersionLabelInTxThreeTransactions(ReassignVersionLabelInTxTest.java:89)
Caused by: javax.jcr.version.VersionException: State has been marked
destroyed: 8d73b533-a938-4795-96f6-9fd263d73569/{}2: State has been marked
destroyed: 8d73b533-a938-4795-96f6-9fd263d73569/{}2: State has been marked
destroyed: 8d73b533-a938-4795-96f6-9fd263d73569/{}2
	at
org.apache.jackrabbit.core.version.InternalVersionHistoryImpl.setVersionLabel(InternalVersionHistoryImpl.java:438)
	at
org.apache.jackrabbit.core.version.AbstractVersionManager.setVersionLabel(AbstractVersionManager.java:511)
	at
org.apache.jackrabbit.core.version.XAVersionManager.setVersionLabel(XAVersionManager.java:411)
	at
org.apache.jackrabbit.core.version.XAVersionManager.setVersionLabel(XAVersionManager.java:183)
	at
org.apache.jackrabbit.core.version.VersionHistoryImpl.addVersionLabel(VersionHistoryImpl.java:139)
	at
ReassignVersionLabelInTxTest$3$1.doInJcr(ReassignVersionLabelInTxTest.java:101)
	at org.springmodules.jcr.JcrTemplate.execute(JcrTemplate.java:76)
	... 30 more
Caused by: javax.jcr.RepositoryException: State has been marked destroyed:
8d73b533-a938-4795-96f6-9fd263d73569/{}2: State has been marked destroyed:
8d73b533-a938-4795-96f6-9fd263d73569/{}2
	at
org.apache.jackrabbit.core.version.NodeStateEx.store(NodeStateEx.java:505)
	at
org.apache.jackrabbit.core.version.InternalVersionHistoryImpl.setVersionLabel(InternalVersionHistoryImpl.java:436)
	... 36 more
Caused by: org.apache.jackrabbit.core.state.NoSuchItemStateException: State
has been marked destroyed: 8d73b533-a938-4795-96f6-9fd263d73569/{}2
	at org.apache.jackrabbit.core.state.ChangeLog.get(ChangeLog.java:116)
	at
org.apache.jackrabbit.core.state.XAItemStateManager.getItemState(XAItemStateManager.java:223)
	at
org.apache.jackrabbit.core.version.NodeStateEx.store(NodeStateEx.java:523)
	at
org.apache.jackrabbit.core.version.NodeStateEx.store(NodeStateEx.java:503)
	... 37 more

Failing test method is:

    public void testReassignVersionLabelInTxThreeTransactions() {
        final String v1 = (String) transactionTemplate.execute(new
TransactionCallback() {
            public Object doInTransaction(TransactionStatus status) {
                return (String) jcrTemplate.execute(new JcrCallback() {
                    public Object doInJcr(Session session) throws
IOException,
                            RepositoryException {
                        Node target =
session.getRootNode().addNode("target3");
                        target.addMixin("mix:versionable");
                        session.save();
                        VersionHistory vh = target.getVersionHistory();
                        Version v1 = target.checkin();
                        vh.addVersionLabel(v1.getName(), "1", false);
                        return v1.getName();
                    }
                });
            }
        });
        final String v2 = (String) transactionTemplate.execute(new
TransactionCallback() {
            public Object doInTransaction(TransactionStatus status) {
                return jcrTemplate.execute(new JcrCallback() {
                    public Object doInJcr(Session session) throws
IOException,
                            RepositoryException {
                        Node target =
session.getRootNode().getNode("target3");
                        VersionHistory vh = target.getVersionHistory();
                        target.checkout();
                        Version v2 = target.checkin();
                        vh.addVersionLabel(v2.getName(), "2", false);
                        return v2.getName();
                    }
                });
            }
        });
        transactionTemplate.execute(new TransactionCallback() {
            public Object doInTransaction(TransactionStatus status) {
                jcrTemplate.execute(new JcrCallback() {
                    public Object doInJcr(Session session) throws
IOException,
                            RepositoryException {
                        Node target =
session.getRootNode().getNode("target3");
                        VersionHistory vh = target.getVersionHistory();
                        target.restore(v1, true);
                        vh.removeVersion(v2);
                        // creating again
                        target.checkout();
                        Version v2 = target.checkin();
                        vh.addVersionLabel(v2.getName(), "2", false); //
this fails
                        return null;
                    }
                });
                return null;
            }
        });
    }

This method creates a node and its first version (which is assigned a label)
in first transaction, then creates second version (which is assigned another
label) in second transaction. Then in the third transaction node is restored
to state stored in first version, second version is removed, new version is
created and assigned a label which was assigned to second version. This last
assignment of label fails.

Please note that same sequence executes successfully if no transactions are
used.
-- 
View this message in context: http://www.nabble.com/Problem-when-trying-to-reuse-version-label-in-transaction-tp17147985p17147985.html
Sent from the Jackrabbit - Users mailing list archive at Nabble.com.


Re: Problem when trying to reuse version label in transaction

Posted by Roman Puchkovskiy <ro...@blandware.com>.
I've forgot to mention versions: Jackrabbit Core 1.4.4, Jencks 2.0,
Springmodules 0.8a, Jackrabbit JCA 1.4 are used.
-- 
View this message in context: http://www.nabble.com/Problem-when-trying-to-reuse-version-label-in-transaction-tp17147985p17148076.html
Sent from the Jackrabbit - Users mailing list archive at Nabble.com.


Re: Problem when trying to reuse version label in transaction

Posted by Roman Puchkovskiy <ro...@blandware.com>.
Hi, Marcel.

Thanks for reply. I've filed an issue:
https://issues.apache.org/jira/browse/JCR-1587


Marcel Reutegger wrote:
> 
> Hi Roman,
> 
> this is probably a bug in jackrabbit. can you please file a jira issue?
> thank you.
> 
> regards
>   marcel
> 
> Roman Puchkovskiy wrote:
>> Hi.
>> 
>> There's a problem with reusage of version label. If version (which has
>> label
>> assigned) is removed inside a transaction, and after this same label is
>> tried to be assigned to another version (in same transaction), exception
>> is
>> thrown.
>> 
>> Maven project with test case is here:
>> http://rpuch.narod.ru/test-reassign-version-label-in-tx.zip
>> When you run 'mvn test', test using transaction fails, following
>> exception
>> is thrown:
>> 
>> org.springframework.dao.DataIntegrityViolationException: Invalid version
>> graph operation; nested exception is javax.jcr.version.VersionException:
>> State has been marked destroyed:
>> 8d73b533-a938-4795-96f6-9fd263d73569/{}2:
>> State has been marked destroyed:
>> 8d73b533-a938-4795-96f6-9fd263d73569/{}2:
>> State has been marked destroyed: 8d73b533-a938-4795-96f6-9fd263d73569/{}2
>> 	at
>> org.springmodules.jcr.SessionFactoryUtils.translateException(SessionFactoryUtils.java:230)
>> 	at
>> org.springmodules.jcr.JcrAccessor.convertJcrAccessException(JcrAccessor.java:58)
>> 	at org.springmodules.jcr.JcrTemplate.execute(JcrTemplate.java:82)
>> 	at org.springmodules.jcr.JcrTemplate.execute(JcrTemplate.java:108)
>> 	at
>> ReassignVersionLabelInTxTest$3.doInTransaction(ReassignVersionLabelInTxTest.java:91)
>> 	at
>> org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:128)
>> 	at
>> ReassignVersionLabelInTxTest.testReassignVersionLabelInTxThreeTransactions(ReassignVersionLabelInTxTest.java:89)
>> Caused by: javax.jcr.version.VersionException: State has been marked
>> destroyed: 8d73b533-a938-4795-96f6-9fd263d73569/{}2: State has been
>> marked
>> destroyed: 8d73b533-a938-4795-96f6-9fd263d73569/{}2: State has been
>> marked
>> destroyed: 8d73b533-a938-4795-96f6-9fd263d73569/{}2
>> 	at
>> org.apache.jackrabbit.core.version.InternalVersionHistoryImpl.setVersionLabel(InternalVersionHistoryImpl.java:438)
>> 	at
>> org.apache.jackrabbit.core.version.AbstractVersionManager.setVersionLabel(AbstractVersionManager.java:511)
>> 	at
>> org.apache.jackrabbit.core.version.XAVersionManager.setVersionLabel(XAVersionManager.java:411)
>> 	at
>> org.apache.jackrabbit.core.version.XAVersionManager.setVersionLabel(XAVersionManager.java:183)
>> 	at
>> org.apache.jackrabbit.core.version.VersionHistoryImpl.addVersionLabel(VersionHistoryImpl.java:139)
>> 	at
>> ReassignVersionLabelInTxTest$3$1.doInJcr(ReassignVersionLabelInTxTest.java:101)
>> 	at org.springmodules.jcr.JcrTemplate.execute(JcrTemplate.java:76)
>> 	... 30 more
>> Caused by: javax.jcr.RepositoryException: State has been marked
>> destroyed:
>> 8d73b533-a938-4795-96f6-9fd263d73569/{}2: State has been marked
>> destroyed:
>> 8d73b533-a938-4795-96f6-9fd263d73569/{}2
>> 	at
>> org.apache.jackrabbit.core.version.NodeStateEx.store(NodeStateEx.java:505)
>> 	at
>> org.apache.jackrabbit.core.version.InternalVersionHistoryImpl.setVersionLabel(InternalVersionHistoryImpl.java:436)
>> 	... 36 more
>> Caused by: org.apache.jackrabbit.core.state.NoSuchItemStateException:
>> State
>> has been marked destroyed: 8d73b533-a938-4795-96f6-9fd263d73569/{}2
>> 	at org.apache.jackrabbit.core.state.ChangeLog.get(ChangeLog.java:116)
>> 	at
>> org.apache.jackrabbit.core.state.XAItemStateManager.getItemState(XAItemStateManager.java:223)
>> 	at
>> org.apache.jackrabbit.core.version.NodeStateEx.store(NodeStateEx.java:523)
>> 	at
>> org.apache.jackrabbit.core.version.NodeStateEx.store(NodeStateEx.java:503)
>> 	... 37 more
>> 
>> Failing test method is:
>> 
>>     public void testReassignVersionLabelInTxThreeTransactions() {
>>         final String v1 = (String) transactionTemplate.execute(new
>> TransactionCallback() {
>>             public Object doInTransaction(TransactionStatus status) {
>>                 return (String) jcrTemplate.execute(new JcrCallback() {
>>                     public Object doInJcr(Session session) throws
>> IOException,
>>                             RepositoryException {
>>                         Node target =
>> session.getRootNode().addNode("target3");
>>                         target.addMixin("mix:versionable");
>>                         session.save();
>>                         VersionHistory vh = target.getVersionHistory();
>>                         Version v1 = target.checkin();
>>                         vh.addVersionLabel(v1.getName(), "1", false);
>>                         return v1.getName();
>>                     }
>>                 });
>>             }
>>         });
>>         final String v2 = (String) transactionTemplate.execute(new
>> TransactionCallback() {
>>             public Object doInTransaction(TransactionStatus status) {
>>                 return jcrTemplate.execute(new JcrCallback() {
>>                     public Object doInJcr(Session session) throws
>> IOException,
>>                             RepositoryException {
>>                         Node target =
>> session.getRootNode().getNode("target3");
>>                         VersionHistory vh = target.getVersionHistory();
>>                         target.checkout();
>>                         Version v2 = target.checkin();
>>                         vh.addVersionLabel(v2.getName(), "2", false);
>>                         return v2.getName();
>>                     }
>>                 });
>>             }
>>         });
>>         transactionTemplate.execute(new TransactionCallback() {
>>             public Object doInTransaction(TransactionStatus status) {
>>                 jcrTemplate.execute(new JcrCallback() {
>>                     public Object doInJcr(Session session) throws
>> IOException,
>>                             RepositoryException {
>>                         Node target =
>> session.getRootNode().getNode("target3");
>>                         VersionHistory vh = target.getVersionHistory();
>>                         target.restore(v1, true);
>>                         vh.removeVersion(v2);
>>                         // creating again
>>                         target.checkout();
>>                         Version v2 = target.checkin();
>>                         vh.addVersionLabel(v2.getName(), "2", false); //
>> this fails
>>                         return null;
>>                     }
>>                 });
>>                 return null;
>>             }
>>         });
>>     }
>> 
>> This method creates a node and its first version (which is assigned a
>> label)
>> in first transaction, then creates second version (which is assigned
>> another
>> label) in second transaction. Then in the third transaction node is
>> restored
>> to state stored in first version, second version is removed, new version
>> is
>> created and assigned a label which was assigned to second version. This
>> last
>> assignment of label fails.
>> 
>> Please note that same sequence executes successfully if no transactions
>> are
>> used.
> 
> 
> 

-- 
View this message in context: http://www.nabble.com/Problem-when-trying-to-reuse-version-label-in-transaction-tp17147985p17149590.html
Sent from the Jackrabbit - Users mailing list archive at Nabble.com.


Re: Problem when trying to reuse version label in transaction

Posted by Marcel Reutegger <ma...@gmx.net>.
Hi Roman,

this is probably a bug in jackrabbit. can you please file a jira issue? thank you.

regards
  marcel

Roman Puchkovskiy wrote:
> Hi.
> 
> There's a problem with reusage of version label. If version (which has label
> assigned) is removed inside a transaction, and after this same label is
> tried to be assigned to another version (in same transaction), exception is
> thrown.
> 
> Maven project with test case is here:
> http://rpuch.narod.ru/test-reassign-version-label-in-tx.zip
> When you run 'mvn test', test using transaction fails, following exception
> is thrown:
> 
> org.springframework.dao.DataIntegrityViolationException: Invalid version
> graph operation; nested exception is javax.jcr.version.VersionException:
> State has been marked destroyed: 8d73b533-a938-4795-96f6-9fd263d73569/{}2:
> State has been marked destroyed: 8d73b533-a938-4795-96f6-9fd263d73569/{}2:
> State has been marked destroyed: 8d73b533-a938-4795-96f6-9fd263d73569/{}2
> 	at
> org.springmodules.jcr.SessionFactoryUtils.translateException(SessionFactoryUtils.java:230)
> 	at
> org.springmodules.jcr.JcrAccessor.convertJcrAccessException(JcrAccessor.java:58)
> 	at org.springmodules.jcr.JcrTemplate.execute(JcrTemplate.java:82)
> 	at org.springmodules.jcr.JcrTemplate.execute(JcrTemplate.java:108)
> 	at
> ReassignVersionLabelInTxTest$3.doInTransaction(ReassignVersionLabelInTxTest.java:91)
> 	at
> org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:128)
> 	at
> ReassignVersionLabelInTxTest.testReassignVersionLabelInTxThreeTransactions(ReassignVersionLabelInTxTest.java:89)
> Caused by: javax.jcr.version.VersionException: State has been marked
> destroyed: 8d73b533-a938-4795-96f6-9fd263d73569/{}2: State has been marked
> destroyed: 8d73b533-a938-4795-96f6-9fd263d73569/{}2: State has been marked
> destroyed: 8d73b533-a938-4795-96f6-9fd263d73569/{}2
> 	at
> org.apache.jackrabbit.core.version.InternalVersionHistoryImpl.setVersionLabel(InternalVersionHistoryImpl.java:438)
> 	at
> org.apache.jackrabbit.core.version.AbstractVersionManager.setVersionLabel(AbstractVersionManager.java:511)
> 	at
> org.apache.jackrabbit.core.version.XAVersionManager.setVersionLabel(XAVersionManager.java:411)
> 	at
> org.apache.jackrabbit.core.version.XAVersionManager.setVersionLabel(XAVersionManager.java:183)
> 	at
> org.apache.jackrabbit.core.version.VersionHistoryImpl.addVersionLabel(VersionHistoryImpl.java:139)
> 	at
> ReassignVersionLabelInTxTest$3$1.doInJcr(ReassignVersionLabelInTxTest.java:101)
> 	at org.springmodules.jcr.JcrTemplate.execute(JcrTemplate.java:76)
> 	... 30 more
> Caused by: javax.jcr.RepositoryException: State has been marked destroyed:
> 8d73b533-a938-4795-96f6-9fd263d73569/{}2: State has been marked destroyed:
> 8d73b533-a938-4795-96f6-9fd263d73569/{}2
> 	at
> org.apache.jackrabbit.core.version.NodeStateEx.store(NodeStateEx.java:505)
> 	at
> org.apache.jackrabbit.core.version.InternalVersionHistoryImpl.setVersionLabel(InternalVersionHistoryImpl.java:436)
> 	... 36 more
> Caused by: org.apache.jackrabbit.core.state.NoSuchItemStateException: State
> has been marked destroyed: 8d73b533-a938-4795-96f6-9fd263d73569/{}2
> 	at org.apache.jackrabbit.core.state.ChangeLog.get(ChangeLog.java:116)
> 	at
> org.apache.jackrabbit.core.state.XAItemStateManager.getItemState(XAItemStateManager.java:223)
> 	at
> org.apache.jackrabbit.core.version.NodeStateEx.store(NodeStateEx.java:523)
> 	at
> org.apache.jackrabbit.core.version.NodeStateEx.store(NodeStateEx.java:503)
> 	... 37 more
> 
> Failing test method is:
> 
>     public void testReassignVersionLabelInTxThreeTransactions() {
>         final String v1 = (String) transactionTemplate.execute(new
> TransactionCallback() {
>             public Object doInTransaction(TransactionStatus status) {
>                 return (String) jcrTemplate.execute(new JcrCallback() {
>                     public Object doInJcr(Session session) throws
> IOException,
>                             RepositoryException {
>                         Node target =
> session.getRootNode().addNode("target3");
>                         target.addMixin("mix:versionable");
>                         session.save();
>                         VersionHistory vh = target.getVersionHistory();
>                         Version v1 = target.checkin();
>                         vh.addVersionLabel(v1.getName(), "1", false);
>                         return v1.getName();
>                     }
>                 });
>             }
>         });
>         final String v2 = (String) transactionTemplate.execute(new
> TransactionCallback() {
>             public Object doInTransaction(TransactionStatus status) {
>                 return jcrTemplate.execute(new JcrCallback() {
>                     public Object doInJcr(Session session) throws
> IOException,
>                             RepositoryException {
>                         Node target =
> session.getRootNode().getNode("target3");
>                         VersionHistory vh = target.getVersionHistory();
>                         target.checkout();
>                         Version v2 = target.checkin();
>                         vh.addVersionLabel(v2.getName(), "2", false);
>                         return v2.getName();
>                     }
>                 });
>             }
>         });
>         transactionTemplate.execute(new TransactionCallback() {
>             public Object doInTransaction(TransactionStatus status) {
>                 jcrTemplate.execute(new JcrCallback() {
>                     public Object doInJcr(Session session) throws
> IOException,
>                             RepositoryException {
>                         Node target =
> session.getRootNode().getNode("target3");
>                         VersionHistory vh = target.getVersionHistory();
>                         target.restore(v1, true);
>                         vh.removeVersion(v2);
>                         // creating again
>                         target.checkout();
>                         Version v2 = target.checkin();
>                         vh.addVersionLabel(v2.getName(), "2", false); //
> this fails
>                         return null;
>                     }
>                 });
>                 return null;
>             }
>         });
>     }
> 
> This method creates a node and its first version (which is assigned a label)
> in first transaction, then creates second version (which is assigned another
> label) in second transaction. Then in the third transaction node is restored
> to state stored in first version, second version is removed, new version is
> created and assigned a label which was assigned to second version. This last
> assignment of label fails.
> 
> Please note that same sequence executes successfully if no transactions are
> used.