[ 
https://issues.apache.org/jira/browse/JCR-1813?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12639880#action_12639880
 ] 

Stephane Landelle commented on JCR-1813:
----------------------------------------

My bad, my patch writes null records instead of not writing them.

A better solution would consist in:

   - adding the hasUpdates method to ChangeLog
   - skipping begin and end in
   org.apache.jackrabbit.core.state.SharedItemStateManager$Update if local has
   no updates with somehing like:

            if (!local.hasUpdates()) {
                return;
            }

Sincerely,

Stephane Landelle

2008/10/15 Stephane Landelle (JIRA) <[EMAIL PROTECTED]>



> Invalid journal records during XATransactions
> ---------------------------------------------
>
>                 Key: JCR-1813
>                 URL: https://issues.apache.org/jira/browse/JCR-1813
>             Project: Jackrabbit
>          Issue Type: Bug
>          Components: clustering
>            Reporter: Stephane Landelle
>            Priority: Critical
>
> 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