[
https://issues.apache.org/jira/browse/OAK-8832?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17090612#comment-17090612
]
Andrei Dulceanu commented on OAK-8832:
--------------------------------------
[~amjain], what do you think about the proposed patch?
To give you a bit of context, we are seeing this on offline compaction only
(which doesn't use a blob store at runtime). The strategy used by checkpoints
compactor is to compact the oldest checkpoint and then each subsequent
checkpoint and the root state *on top of what was previously compacted*. In
case of external blobs which changed in the root state {{SegmentBlob#equals}}
is called, which in turn uses {{SegmentBlob#length}} to short circuit the
comparison in case of different lengths. However, the latter attempts to
compute the length by actually retrieving the blob from the blob store, hence
the error message.
Reading the comments from OAK-5253, I know that in the past you suggested using
the blob content identity to optimize {{AbstractBlob#equal}}. Although I
understood the concerns raised there, it seems to me that we can still apply
the attached patch given its limited scope and use case (the short circuit
based on content identity will happen only if the blob store is not configured).
Let me know your thoughts. Thanks!
> Offline Compaction fails while erroneously accessing external blob
> -------------------------------------------------------------------
>
> Key: OAK-8832
> URL: https://issues.apache.org/jira/browse/OAK-8832
> Project: Jackrabbit Oak
> Issue Type: Bug
> Components: segment-tar
> Affects Versions: 1.10.0, 1.12.0, 1.8.11, 1.14.0, 1.16.0, 1.18.0, 1.20.0,
> 1.22.0
> Reporter: Andrei Dulceanu
> Assignee: Andrei Dulceanu
> Priority: Critical
> Attachments: OAK-8832.patch
>
>
> Relevant stack trace:
> {noformat}
> INFO [2019-12-06 01:07:39,345]
> org.apache.jackrabbit.oak.segment.file.FileStore: TarMK GC #0: compacting
> root.
> java.lang.IllegalStateException: Attempt to read external blob with blobId
> [95c88847bd388c05fc332e737dda714630c11351d1949ffd1a03b7b09b92d1ea#71399]
> without specifying BlobStore
> INFO [2019-12-06 01:07:39,753]
> org.apache.jackrabbit.oak.segment.file.FileStore: TarMK closed:
> /mnt/sandbox/tmp/1575594001228-0
> at
> org.apache.jackrabbit.oak.segment.SegmentBlob.getBlob(SegmentBlob.java:248)
> at
> org.apache.jackrabbit.oak.segment.SegmentBlob.getLength(SegmentBlob.java:257)
> at
> org.apache.jackrabbit.oak.segment.SegmentBlob.length(SegmentBlob.java:109)
> at
> org.apache.jackrabbit.oak.segment.SegmentBlob.equals(SegmentBlob.java:185)
> at com.google.common.base.Objects.equal(Objects.java:52)
> at
> org.apache.jackrabbit.oak.plugins.memory.AbstractPropertyState.equal(AbstractPropertyState.java:59)
> at
> org.apache.jackrabbit.oak.segment.SegmentPropertyState.equals(SegmentPropertyState.java:249)
> at
> org.apache.jackrabbit.oak.segment.SegmentNodeState.compareProperties(SegmentNodeState.java:664)
> at
> org.apache.jackrabbit.oak.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:558)
> at
> org.apache.jackrabbit.oak.segment.Compactor$CompactDiff.diff(Compactor.java:165)
> at
> org.apache.jackrabbit.oak.segment.Compactor.compact(Compactor.java:123)
> at
> org.apache.jackrabbit.oak.segment.Compactor$CompactDiff.childNodeChanged(Compactor.java:217)
> at
> org.apache.jackrabbit.oak.segment.CancelableDiff.childNodeChanged(CancelableDiff.java:85)
> at
> org.apache.jackrabbit.oak.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:598)
> at
> org.apache.jackrabbit.oak.segment.Compactor$CompactDiff.diff(Compactor.java:165)
> at
> org.apache.jackrabbit.oak.segment.Compactor.compact(Compactor.java:123)
> at
> org.apache.jackrabbit.oak.segment.Compactor$CompactDiff.childNodeChanged(Compactor.java:217)
> at
> org.apache.jackrabbit.oak.segment.CancelableDiff.childNodeChanged(CancelableDiff.java:85)
> at
> org.apache.jackrabbit.oak.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:598)
> at
> org.apache.jackrabbit.oak.segment.Compactor$CompactDiff.diff(Compactor.java:165)
> at
> org.apache.jackrabbit.oak.segment.Compactor.compact(Compactor.java:123)
> at
> org.apache.jackrabbit.oak.segment.Compactor$CompactDiff.childNodeChanged(Compactor.java:217)
> at
> org.apache.jackrabbit.oak.segment.CancelableDiff.childNodeChanged(CancelableDiff.java:85)
> at
> org.apache.jackrabbit.oak.segment.MapRecord.compare(MapRecord.java:422)
> at
> org.apache.jackrabbit.oak.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:651)
> at
> org.apache.jackrabbit.oak.segment.Compactor$CompactDiff.diff(Compactor.java:165)
> at
> org.apache.jackrabbit.oak.segment.Compactor.compact(Compactor.java:123)
> at
> org.apache.jackrabbit.oak.segment.Compactor$CompactDiff.childNodeChanged(Compactor.java:217)
> at
> org.apache.jackrabbit.oak.segment.CancelableDiff.childNodeChanged(CancelableDiff.java:85)
> at
> org.apache.jackrabbit.oak.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:598)
> at
> org.apache.jackrabbit.oak.segment.Compactor$CompactDiff.diff(Compactor.java:165)
> at
> org.apache.jackrabbit.oak.segment.Compactor.compact(Compactor.java:123)
> at
> org.apache.jackrabbit.oak.segment.Compactor$CompactDiff.childNodeChanged(Compactor.java:217)
> at
> org.apache.jackrabbit.oak.segment.CancelableDiff.childNodeChanged(CancelableDiff.java:85)
> at
> org.apache.jackrabbit.oak.segment.MapRecord$3.childNodeChanged(MapRecord.java:408)
> at
> org.apache.jackrabbit.oak.segment.MapRecord$4.childNodeChanged(MapRecord.java:449)
> at
> org.apache.jackrabbit.oak.segment.MapRecord.compare(MapRecord.java:495)
> at
> org.apache.jackrabbit.oak.segment.MapRecord.compare(MapRecord.java:440)
> at
> org.apache.jackrabbit.oak.segment.MapRecord.compare(MapRecord.java:398)
> at
> org.apache.jackrabbit.oak.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:651)
> at
> org.apache.jackrabbit.oak.segment.Compactor$CompactDiff.diff(Compactor.java:165)
> at
> org.apache.jackrabbit.oak.segment.Compactor.compact(Compactor.java:123)
> at
> org.apache.jackrabbit.oak.segment.Compactor$CompactDiff.childNodeChanged(Compactor.java:217)
> at
> org.apache.jackrabbit.oak.segment.CancelableDiff.childNodeChanged(CancelableDiff.java:85)
> at
> org.apache.jackrabbit.oak.segment.MapRecord.compare(MapRecord.java:422)
> at
> org.apache.jackrabbit.oak.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:651)
> at
> org.apache.jackrabbit.oak.segment.Compactor$CompactDiff.diff(Compactor.java:165)
> at
> org.apache.jackrabbit.oak.segment.Compactor.compact(Compactor.java:123)
> at
> org.apache.jackrabbit.oak.segment.Compactor$CompactDiff.childNodeChanged(Compactor.java:217)
> at
> org.apache.jackrabbit.oak.segment.CancelableDiff.childNodeChanged(CancelableDiff.java:85)
> at
> org.apache.jackrabbit.oak.segment.MapRecord.compare(MapRecord.java:422)
> at
> org.apache.jackrabbit.oak.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:651)
> at
> org.apache.jackrabbit.oak.segment.Compactor$CompactDiff.diff(Compactor.java:165)
> at
> org.apache.jackrabbit.oak.segment.Compactor.compact(Compactor.java:123)
> at
> org.apache.jackrabbit.oak.segment.Compactor$CompactDiff.childNodeChanged(Compactor.java:217)
> at
> org.apache.jackrabbit.oak.segment.CancelableDiff.childNodeChanged(CancelableDiff.java:85)
> at
> org.apache.jackrabbit.oak.segment.MapRecord.compare(MapRecord.java:422)
> at
> org.apache.jackrabbit.oak.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:651)
> at
> org.apache.jackrabbit.oak.segment.Compactor$CompactDiff.diff(Compactor.java:165)
> at
> org.apache.jackrabbit.oak.segment.Compactor.compact(Compactor.java:123)
> at
> org.apache.jackrabbit.oak.segment.Compactor$CompactDiff.childNodeChanged(Compactor.java:217)
> at
> org.apache.jackrabbit.oak.segment.CancelableDiff.childNodeChanged(CancelableDiff.java:85)
> at
> org.apache.jackrabbit.oak.segment.MapRecord.compare(MapRecord.java:495)
> at
> org.apache.jackrabbit.oak.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:651)
> at
> org.apache.jackrabbit.oak.segment.Compactor$CompactDiff.diff(Compactor.java:165)
> at
> org.apache.jackrabbit.oak.segment.Compactor.compact(Compactor.java:123)
> at
> org.apache.jackrabbit.oak.segment.CheckpointCompactor.compactWithCache(CheckpointCompactor.java:249)
> at
> org.apache.jackrabbit.oak.segment.CheckpointCompactor.compact(CheckpointCompactor.java:172)
> at
> org.apache.jackrabbit.oak.segment.CheckpointCompactor.compact(CheckpointCompactor.java:119)
> at
> org.apache.jackrabbit.oak.segment.file.AbstractCompactionStrategy.compact(AbstractCompactionStrategy.java:150)
> at
> org.apache.jackrabbit.oak.segment.file.FullCompactionStrategy.compact(FullCompactionStrategy.java:42)
> at
> org.apache.jackrabbit.oak.segment.file.AbstractGarbageCollectionStrategy.compactFull(AbstractGarbageCollectionStrategy.java:77)
> at
> org.apache.jackrabbit.oak.segment.file.SynchronizedGarbageCollectionStrategy.compactFull(SynchronizedGarbageCollectionStrategy.java:59)
> at
> org.apache.jackrabbit.oak.segment.file.GarbageCollector.compactFull(GarbageCollector.java:296)
> at
> org.apache.jackrabbit.oak.segment.file.FileStore.compactFull(FileStore.java:394)
> at org.apache.jackrabbit.oak.segment.tool.Compact.run(Compact.java:274)
> at
> com.adobe.granite.farmer.core.compaction.Compactor.compact(Compactor.java:85)
> at
> com.adobe.granite.farmer.core.compaction.Compactor.compact(Compactor.java:47)
> at
> com.adobe.granite.farmer.core.compaction.CompactorJob.execute(CompactorJob.java:77)
> at
> com.adobe.granite.farmer.PublishFarmerApplication$RunnerJob.execute(PublishFarmerApplication.java:238)
> at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
> at
> org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
> {noformat}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)