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

Reply via email to