Author: jukka
Date: Sat Mar 22 01:12:42 2014
New Revision: 1580106

URL: http://svn.apache.org/r1580106
Log:
OAK-1566: ArrayIndexOutOfBoundsException in Segment.getRefId()

Fix SegmentSizeTest expectations.

Modified:
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentSizeTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentSizeTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentSizeTest.java?rev=1580106&r1=1580105&r2=1580106&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentSizeTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentSizeTest.java
 Sat Mar 22 01:12:42 2014
@@ -40,29 +40,29 @@ public class SegmentSizeTest {
     @Test
     public void testNodeSize() {
         NodeBuilder builder = EMPTY_NODE.builder();
-        assertEquals(40, getSize(builder));
+        assertEquals(48, getSize(builder));
         assertEquals(4, getAmortizedSize(builder));
 
         builder = EMPTY_NODE.builder();
         builder.setProperty("foo", "bar");
-        assertEquals(44, getSize(builder));
+        assertEquals(48, getSize(builder));
         assertEquals(8, getAmortizedSize(builder));
 
         builder = EMPTY_NODE.builder();
         builder.setProperty("foo", "bar");
         builder.setProperty("baz", 123);
-        assertEquals(60, getSize(builder));
+        assertEquals(64, getSize(builder));
         assertEquals(12, getAmortizedSize(builder));
 
         builder = EMPTY_NODE.builder();
         builder.child("foo");
-        assertEquals(60, getSize(builder));
+        assertEquals(64, getSize(builder));
         assertEquals(12, getAmortizedSize(builder));
 
         builder = EMPTY_NODE.builder();
         builder.child("foo");
         builder.child("bar");
-        assertEquals(88, getSize(builder));
+        assertEquals(96, getSize(builder));
         assertEquals(40, getAmortizedSize(builder));
     }
 
@@ -70,43 +70,55 @@ public class SegmentSizeTest {
     public void testDuplicateStrings() {
         String string = "More than just a few bytes of example content.";
 
-        NodeBuilder builder = EMPTY_NODE.builder();
+        SegmentWriter writer = new MemoryStore().getTracker().getWriter();
+        SegmentNodeBuilder builder = writer.writeNode(EMPTY_NODE).builder();
+
         builder.setProperty(PropertyStates.createProperty(
                 "test", Collections.nCopies(1, string), Type.STRINGS));
-        int base = getSize(builder);
+        RecordId id1 = builder.getNodeState().getRecordId();
 
         builder.setProperty(PropertyStates.createProperty(
                 "test", Collections.nCopies(12, string), Type.STRINGS));
-        assertEquals(base + 12 * Segment.RECORD_ID_BYTES, getSize(builder));
+        RecordId id2 = builder.getNodeState().getRecordId();
+        assertEquals(16 + 12 * Segment.RECORD_ID_BYTES,
+                id1.getOffset() - id2.getOffset());
 
         builder.setProperty(PropertyStates.createProperty(
                 "test", Collections.nCopies(100, string), Type.STRINGS));
-        assertEquals(base + 100 * Segment.RECORD_ID_BYTES, getSize(builder));
+        RecordId id3 = builder.getNodeState().getRecordId();
+        assertEquals(16 + 100 * Segment.RECORD_ID_BYTES,
+                id2.getOffset() - id3.getOffset());
     }
 
     @Test
     public void testDuplicateDates() {
         String now = ISO8601.format(Calendar.getInstance());
 
-        NodeBuilder builder = EMPTY_NODE.builder();
+        SegmentWriter writer = new MemoryStore().getTracker().getWriter();
+        SegmentNodeBuilder builder = writer.writeNode(EMPTY_NODE).builder();
+
         builder.setProperty(PropertyStates.createProperty(
                 "test", Collections.nCopies(1, now), Type.DATES));
-        int base = getSize(builder);
+        RecordId id1 = builder.getNodeState().getRecordId();
 
         builder.setProperty(PropertyStates.createProperty(
                 "test", Collections.nCopies(12, now), Type.DATES));
-        assertEquals(base + 12 * Segment.RECORD_ID_BYTES, getSize(builder));
+        RecordId id2 = builder.getNodeState().getRecordId();
+        assertEquals(16 + 12 * Segment.RECORD_ID_BYTES,
+                id1.getOffset() - id2.getOffset());
 
         builder.setProperty(PropertyStates.createProperty(
                 "test", Collections.nCopies(100, now), Type.DATES));
-        assertEquals(base + 100 * Segment.RECORD_ID_BYTES, getSize(builder));
+        RecordId id3 = builder.getNodeState().getRecordId();
+        assertEquals(16 + 100 * Segment.RECORD_ID_BYTES,
+                id2.getOffset() - id3.getOffset());
     }
 
     @Test
     public void testAccessControlNodes() {
         NodeBuilder builder = EMPTY_NODE.builder();
         builder.setProperty("jcr:primaryType", "rep:ACL", Type.NAME);
-        assertEquals(40, getSize(builder));
+        assertEquals(48, getSize(builder));
         assertEquals(4, getAmortizedSize(builder));
 
         NodeBuilder deny = builder.child("deny");
@@ -114,7 +126,7 @@ public class SegmentSizeTest {
         deny.setProperty("rep:principalName", "everyone");
         deny.setProperty(PropertyStates.createProperty(
                 "rep:privileges", ImmutableList.of("jcr:read"), Type.NAMES));
-        assertEquals(164, getSize(builder));
+        assertEquals(176, getSize(builder));
         assertEquals(28, getAmortizedSize(builder));
 
         NodeBuilder allow = builder.child("allow");
@@ -122,7 +134,7 @@ public class SegmentSizeTest {
         allow.setProperty("rep:principalName", "administrators");
         allow.setProperty(PropertyStates.createProperty(
                 "rep:privileges", ImmutableList.of("jcr:all"), Type.NAMES));
-        assertEquals(284, getSize(builder));
+        assertEquals(288, getSize(builder));
         assertEquals(72, getAmortizedSize(builder));
 
         NodeBuilder deny0 = builder.child("deny0");
@@ -131,7 +143,7 @@ public class SegmentSizeTest {
         deny0.setProperty("rep:glob", "*/activities/*");
         builder.setProperty(PropertyStates.createProperty(
                 "rep:privileges", ImmutableList.of("jcr:read"), Type.NAMES));
-        assertEquals(376, getSize(builder));
+        assertEquals(384, getSize(builder));
         assertEquals(108, getAmortizedSize(builder));
 
         NodeBuilder allow0 = builder.child("allow0");
@@ -169,30 +181,18 @@ public class SegmentSizeTest {
     }
 
     private int getSize(NodeBuilder builder) {
-        SegmentStore store = new MemoryStore();
-        SegmentWriter writer = store.getTracker().getWriter();
+        SegmentWriter writer = new MemoryStore().getTracker().getWriter();
         RecordId id = writer.writeNode(builder.getNodeState()).getRecordId();
         writer.flush();
-        Segment segment = store.readSegment(id.getSegmentId());
-        return segment.size();
+        return id.getSegment().size();
     }
 
     private int getAmortizedSize(NodeBuilder builder) {
-        SegmentStore store = new MemoryStore();
-        SegmentWriter writer = store.getTracker().getWriter();
+        SegmentWriter writer = new MemoryStore().getTracker().getWriter();
         NodeState state = builder.getNodeState();
-        RecordId id = writer.writeNode(state).getRecordId();
-        writer.flush();
-        Segment segment = store.readSegment(id.getSegmentId());
-        int base = segment.size();
-
-        store = new MemoryStore(); // avoid cross-segment caching
-        writer = store.getTracker().getWriter();
-        writer.writeNode(state);
-        id = writer.writeNode(state).getRecordId();
-        writer.flush();
-        segment = store.readSegment(id.getSegmentId());
-        return segment.size() - base - 4;
+        RecordId id1 = writer.writeNode(state).getRecordId();
+        RecordId id2 = writer.writeNode(state).getRecordId();
+        return id1.getOffset() - id2.getOffset();
     }
 
 }


Reply via email to