Index: oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentPropertyState.java =================================================================== --- oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentPropertyState.java (revision 1728484) +++ oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentPropertyState.java (working copy) @@ -25,6 +25,7 @@ import static java.util.Collections.emptyList; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonList; +import static org.apache.jackrabbit.oak.api.Type.BINARIES; import static org.apache.jackrabbit.oak.api.Type.BINARY; import static org.apache.jackrabbit.oak.api.Type.BOOLEAN; import static org.apache.jackrabbit.oak.api.Type.DATE; @@ -200,13 +201,17 @@ @Override public long size(int index) { - Segment segment = getSegment(); - ListRecord values = getValueList(segment); + ListRecord values = getValueList(getSegment()); checkElementIndex(index, values.size()); - return segment.readLength(values.getEntry(0)); + RecordId entry = values.getEntry(index); + + if (getType().equals(BINARY) || getType().equals(BINARIES)) { + return new SegmentBlob(entry).length(); + } + + return getSegment().readLength(entry); } - //------------------------------------------------------------< Object >-- @Override Index: oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/ExternalBlobIT.java =================================================================== --- oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/ExternalBlobIT.java (revision 1728484) +++ oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/ExternalBlobIT.java (working copy) @@ -22,6 +22,7 @@ import org.apache.commons.io.IOUtils; import org.apache.jackrabbit.core.data.FileDataStore; import org.apache.jackrabbit.oak.api.Blob; +import org.apache.jackrabbit.oak.api.PropertyState; import org.apache.jackrabbit.oak.plugins.blob.ReferenceCollector; import org.apache.jackrabbit.oak.plugins.blob.datastore.DataStoreBlobStore; import org.apache.jackrabbit.oak.plugins.memory.AbstractBlob; @@ -47,13 +48,13 @@ import javax.annotation.Nonnull; -import static junit.framework.Assert.assertTrue; import static org.apache.jackrabbit.oak.commons.FixturesHelper.getFixtures; import static org.apache.jackrabbit.oak.commons.FixturesHelper.Fixture.SEGMENT_MK; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assume.assumeTrue; +import static org.junit.Assert.assertTrue; public class ExternalBlobIT { @@ -228,4 +229,27 @@ return blobId; } } + + @Test + public void testSize() throws Exception { + FileDataStore fds = createFileDataStore(); + DataStoreBlobStore dbs = new DataStoreBlobStore(fds); + nodeStore = getNodeStore(dbs); + + int size = Segment.MEDIUM_LIMIT + 1; + byte[] data2 = new byte[size]; + new Random().nextBytes(data2); + + Blob b = nodeStore.createBlob(new ByteArrayInputStream(data2)); + NodeBuilder builder = nodeStore.getRoot().builder(); + builder.child("hello").setProperty("world", b); + nodeStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); + + + PropertyState ps = nodeStore.getRoot().getChildNode("hello").getProperty("world"); + // world = {2318851547697882338 bytes} + + assertEquals(size, ps.size()); + // assertEquals("{" + size + " bytes}", ps.toString()); + } }