Author: frm
Date: Fri Feb  5 08:35:56 2016
New Revision: 1728616

URL: http://svn.apache.org/viewvc?rev=1728616&view=rev
Log:
OAK-3965 - SegmentPropertyState external binary property reports unusual size

Thanks to Alex Parvulescu for the test

Modified:
    
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentPropertyState.java
    
jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/ExternalBlobIT.java

Modified: 
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentPropertyState.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentPropertyState.java?rev=1728616&r1=1728615&r2=1728616&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentPropertyState.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentPropertyState.java
 Fri Feb  5 08:35:56 2016
@@ -25,6 +25,7 @@ import static com.google.common.collect.
 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,12 +201,16 @@ public class SegmentPropertyState extend
 
     @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 >--
 

Modified: 
jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/ExternalBlobIT.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/ExternalBlobIT.java?rev=1728616&r1=1728615&r2=1728616&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/ExternalBlobIT.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/ExternalBlobIT.java
 Fri Feb  5 08:35:56 2016
@@ -22,6 +22,7 @@ import org.apache.commons.io.FileUtils;
 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 java.util.Random;
 
 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 @@ public class ExternalBlobIT {
             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());
+    }
 }


Reply via email to