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