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

Jukka Zitting reopened JCR-1813:
--------------------------------


Hmm, you're right. I was just thinking about the original use case where a 
distributed transaction that has no Jackrabbit changes is committed.

Reopening this issue so I remember to look at it more before releasing 1.5.0. I 
guess it would be a good to set up a clustered test case for the following code:

    Session session = repository.login(...);
    try {
        session.save();
    } finally {
        session.logout();
    }

This should at least not cause cluster nodes to fail. It would be nice if it 
also didn't result in any journal entries.

> Invalid journal records during XATransactions
> ---------------------------------------------
>
>                 Key: JCR-1813
>                 URL: https://issues.apache.org/jira/browse/JCR-1813
>             Project: Jackrabbit
>          Issue Type: Bug
>          Components: clustering, jackrabbit-core
>            Reporter: Stephane Landelle
>            Assignee: Jukka Zitting
>            Priority: Critical
>             Fix For: 1.5.0
>
>
> During the prepare phase of a XATransaction, XAItemStateManager.prepare calls 
> ShareItemStageManager.beginUpdate that, in case of a ClusterNode, calls 
> ClusterNode.updatePrepared that does a ChangeLogRecord.write().
> This last method is located in ClusterRecord and systematically write the 
> begin and the end of the journal record.
> As a consequence, useless corrupted records are written in the journal 
> everytime a transaction ends without jackrabbit update! This causes polution 
> of the journal, as other cluster nodes try to sync with the corrupted updates 
> and fail doing so as ClusterRecordDeserializer can't deserialize it (the 
> record identifier is empty).
> ChangeLogRecord (and even other ClusterRecord implementations too) should 
> only write if there's effective updates.
> I propose the following solution:
> *) add the following method in Changelog so clients can know if there's 
> effective updates:
>     public boolean hasUpdates() {
>       return !(addedStates.isEmpty() && modifiedStates.isEmpty() && 
> deletedStates.isEmpty() && modifiedRefs.isEmpty());
>     }
> *) change ClusterRecord with:
>     public final void write() throws JournalException {
>       
>       if (hasUpdates()) {
>               record.writeString(workspace);
>               doWrite();
>               record.writeChar(END_MARKER);
>       }
>     }
>     
>     protected abstract boolean hasUpdates();
> *) implement hasUpdates for every ClusterRecord implementation:
>  ----> ChangeLogRecord:
>     protected boolean hasUpdates() {
>       return changes.hasUpdates() || !events.isEmpty();
>     }
>  ----> LockRecord and NamespaceRecord:
>     protected boolean hasUpdates() {
>       return true;
>     }
>  ----> NodeTypeRecord:
>     protected boolean hasUpdates() {
>       return !collection.isEmpty();
>     }
> Best regards,
> Stephane Landelle

-- 
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