[
https://issues.apache.org/jira/browse/JCR-1813?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12679022#action_12679022
]
Ian Boston commented on JCR-1813:
---------------------------------
Ignore my previous comment, I have a workarround in the form of a custom (ugly)
AppendRecord
For anyone else with the same problem it can be found at
https://source.sakaiproject.org/contrib/k2/trunk/kernel/src/main/java/org/sakaiproject/kernel/jcr/jackrabbit/journal/
until the 1.4.x series gets updated or we move to 1.5.
> Invalid journal records during XATransactions
> ---------------------------------------------
>
> Key: JCR-1813
> URL: https://issues.apache.org/jira/browse/JCR-1813
> Project: Jackrabbit Content Repository
> 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.