Author: mduerig Date: Wed Mar 7 16:18:23 2018 New Revision: 1826132 URL: http://svn.apache.org/viewvc?rev=1826132&view=rev Log: OAK-7317: SegmentParser#parseBlob does not long ids of external blobs
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentParser.java jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentParserTest.java Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentParser.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentParser.java?rev=1826132&r1=1826131&r2=1826132&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentParser.java (original) +++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentParser.java Wed Mar 7 16:18:23 2018 @@ -19,17 +19,20 @@ package org.apache.jackrabbit.oak.segment; +import static com.google.common.base.Charsets.UTF_8; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Lists.newArrayListWithCapacity; import static java.util.Collections.singletonList; +import static java.util.Objects.requireNonNull; import static org.apache.jackrabbit.oak.api.Type.BINARY; -import static org.apache.jackrabbit.oak.segment.SegmentStream.BLOCK_SIZE; import static org.apache.jackrabbit.oak.segment.ListRecord.LEVEL_SIZE; import static org.apache.jackrabbit.oak.segment.Segment.MEDIUM_LIMIT; import static org.apache.jackrabbit.oak.segment.Segment.RECORD_ID_BYTES; import static org.apache.jackrabbit.oak.segment.Segment.SMALL_LIMIT; +import static org.apache.jackrabbit.oak.segment.SegmentBlob.readBlobId; +import static org.apache.jackrabbit.oak.segment.SegmentStream.BLOCK_SIZE; import static org.apache.jackrabbit.oak.segment.Template.MANY_CHILD_NODES; import static org.apache.jackrabbit.oak.segment.Template.ZERO_CHILD_NODES; @@ -674,8 +677,13 @@ public class SegmentParser { size += (8 + RECORD_ID_BYTES + length); blobType = BlobType.LONG; } else if ((head & 0xf0) == 0xe0) { - // 1110 xxxx: external value - int length = (head & 0x0f) << 8 | (segment.readByte(blobId.getRecordNumber(), 1) & 0xff); + // 1110 xxxx: external value, short blob ID + int length = UTF_8.encode(requireNonNull(readBlobId(segment, blobId.getRecordNumber()))).limit(); + size += (2 + length); + blobType = BlobType.EXTERNAL; + } else if ((head & 0xf8) == 0xf0) { + // 1111 0xxx: external value, long blob ID + int length = UTF_8.encode(requireNonNull(readBlobId(segment, blobId.getRecordNumber()))).limit(); size += (2 + length); blobType = BlobType.EXTERNAL; } else { Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentParserTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentParserTest.java?rev=1826132&r1=1826131&r2=1826132&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentParserTest.java (original) +++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentParserTest.java Wed Mar 7 16:18:23 2018 @@ -64,7 +64,6 @@ import org.apache.jackrabbit.oak.segment import org.apache.jackrabbit.oak.segment.memory.MemoryStore; import org.apache.jackrabbit.oak.spi.blob.BlobStore; import org.apache.jackrabbit.oak.spi.state.NodeBuilder; -import org.junit.Assume; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -374,8 +373,6 @@ public class SegmentParserTest { @Test public void longBlob() throws IOException { SegmentBlob blob = new SegmentBlob(store.getBlobStore(), writer.writeBlob(createRandomBlob(MEDIUM_LIMIT))); - // FIXME OAK-7317: SegmentParser#parseBlob does not long ids of external blobs - Assume.assumeTrue(blob.getBlobId() == null || "shortId".equals(blob.getBlobId())); ValueInfo valueInfo = new TestParser(store.getReader(), "longBlob") { @Override protected void onBlob(RecordId parentId, RecordId blobId) {