[ 
https://issues.apache.org/jira/browse/OAK-2294?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Alex Parvulescu updated OAK-2294:
---------------------------------
    Attachment: OAK-2294-v7.patch

attaching V7. as it turns out keeping both V10 and V11 read&write support is a 
bit tricky so this version is a bit more complex. I had to introduce a 
SegmentVersion (heavily inpired by lucene's Version class).
I managed to add some backwards compatibility tests (write as V10 and then read 
from a V11 store), and a good thing that was, I actually uncovered a bug while 
writing them. the question remains if they are enough or if some more node 
structures need to be added.

this patch also fixes the record analyzer tests, but I think those parts may 
need closer inspection.

For _SegmentReferenceLimitTestIT_ I changed the dynamic a bit, lowered the 
number of writes and increased the number of threads. test still fails on the 
old version, passes on this one but at least there's no more OOME during the IT 
tests.
Not the same can be said about _LargeNumberOfPropertiesTestIT_. I ignored the 
tests so it doesn't run during ITs, I couldn't find any slimmer version of it 
other than increasing the heap size during the tests. I'm not sure what to do 
here.

as usual [~mduerig] feedback is kindly requested :)




> Corrupt repository after concurrent version operations
> ------------------------------------------------------
>
>                 Key: OAK-2294
>                 URL: https://issues.apache.org/jira/browse/OAK-2294
>             Project: Jackrabbit Oak
>          Issue Type: Bug
>          Components: segmentmk
>            Reporter: Michael Dürig
>            Assignee: Alex Parvulescu
>              Labels: corruption
>             Fix For: 1.0.12, 1.1.8
>
>         Attachments: OAK-2294-2.patch, OAK-2294-v3.patch, OAK-2294-v4.patch, 
> OAK-2294-v5.patch, OAK-2294-v6.patch, OAK-2294-v7.patch, OAK-2294.patch
>
>
> Performing version operations (checkin / checkout / addVersionLabel) 
> concurrently can corrupt the repository. 
> Executing the following code in parallel from multiple threads demonstrates 
> this:
> {code}
> Version version = versionManager.checkin(vPath);
> versionManager.checkout(vPath);
> String label = version.getName() + " " + Thread.currentThread().getName();
> version.getContainingHistory()
>     .addVersionLabel(version.getName(), label, true);
> {code}
> In my tests this eventually lead to all sorts of exceptions:
> {noformat}
> java.lang.IllegalStateException: RefId '85' doesn't exist in data segment 
> 0c5c0814-902c-429c-ad41-cd82aea276a2
>       at 
> org.apache.jackrabbit.oak.plugins.segment.Segment.getRefId(Segment.java:196)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.Segment.internalReadRecordId(Segment.java:307)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.Segment.readRecordId(Segment.java:303)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.MapRecord.getBucketList(MapRecord.java:134)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.MapRecord.getEntries(MapRecord.java:347)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.MapRecord.getEntries(MapRecord.java:325)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.MapRecord.compare(MapRecord.java:474)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.MapRecord.compare(MapRecord.java:394)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:544)
> ...
> {noformat}
> {noformat}
> java.lang.IllegalStateException: String is too long: 2159501163930351661
>       at 
> org.apache.jackrabbit.oak.plugins.segment.Segment.loadString(Segment.java:352)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.Segment.readString(Segment.java:319)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.Segment.readString(Segment.java:313)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.Segment.loadTemplate(Segment.java:418)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.Segment.readTemplate(Segment.java:367)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.Segment.readTemplate(Segment.java:361)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.getTemplate(SegmentNodeState.java:78)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:408)
> ...
> {noformat}
> {noformat}
> java.lang.IllegalStateException
>       at 
> com.google.common.base.Preconditions.checkState(Preconditions.java:134)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.file.TarWriter.writeEntry(TarWriter.java:206)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.file.TarWriter.writeEntry(TarWriter.java:200)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.file.FileStore.writeSegment(FileStore.java:682)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentWriter.flush(SegmentWriter.java:228)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentWriter.prepare(SegmentWriter.java:329)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentWriter.writeTemplate(SegmentWriter.java:969)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentWriter.writeNode(SegmentWriter.java:1039)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentWriter$2.childNodeChanged(SegmentWriter.java:1062)
>       at 
> org.apache.jackrabbit.oak.plugins.memory.ModifiedNodeState.compareAgainstBaseState(ModifiedNodeState.java:395)
> ...
> {noformat}
> {noformat}
> Caused by: java.lang.IllegalArgumentException: Invalid type tag: 81
>       at org.apache.jackrabbit.oak.api.Type.fromTag(Type.java:202)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.Segment.loadTemplate(Segment.java:418)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.Segment.readTemplate(Segment.java:367)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.Segment.readTemplate(Segment.java:361)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.getTemplate(SegmentNodeState.java:78)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.getProperty(SegmentNodeState.java:122)
> ...
> {noformat}
> {noformat}
> Caused by: java.lang.IllegalStateException
>       at 
> com.google.common.base.Preconditions.checkState(Preconditions.java:134)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.Segment.pos(Segment.java:178)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.Segment.loadString(Segment.java:326)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.Segment.readString(Segment.java:319)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.Segment.readString(Segment.java:313)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentPropertyState.getValue(SegmentPropertyState.java:174)
>       at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentPropertyState.getValue(SegmentPropertyState.java:147)
>       at 
> org.apache.jackrabbit.oak.plugins.memory.AbstractPropertyState.equal(AbstractPropertyState.java:53)
> ...
> {noformat}
> Will attach a patch with a test case shortly.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to