You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by fr...@apache.org on 2016/06/30 14:06:31 UTC

svn commit: r1750801 - in /jackrabbit/oak/trunk/oak-segment-tar/src: main/java/org/apache/jackrabbit/oak/segment/ test/java/org/apache/jackrabbit/oak/segment/ test/java/org/apache/jackrabbit/oak/segment/file/

Author: frm
Date: Thu Jun 30 14:06:31 2016
New Revision: 1750801

URL: http://svn.apache.org/viewvc?rev=1750801&view=rev
Log:
OAK-4525 - Ensure that unreferenced node records are root records in a segment

Modified:
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordWriters.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentSizeTest.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/NodeRecordTest.java

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordWriters.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordWriters.java?rev=1750801&r1=1750800&r2=1750801&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordWriters.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordWriters.java Thu Jun 30 14:06:31 2016
@@ -496,12 +496,17 @@ final class RecordWriters {
 
         @Override
         protected RecordId writeRecordContent(RecordId id, SegmentBufferWriter writer) {
+
+            // Write the stable record ID. This is only a marker and is not a
+            // reference to another record. Because of this, those record IDs
+            // should not be marked as references.
+
             if (stableId == null) {
                 // Write this node's record id to indicate that the stable id is not
                 // explicitly stored.
-                writer.writeRecordId(id);
+                writer.writeRecordId(id, false);
             } else {
-                writer.writeRecordId(stableId);
+                writer.writeRecordId(stableId, false);
             }
 
             for (RecordId recordId : ids) {

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java?rev=1750801&r1=1750800&r2=1750801&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java Thu Jun 30 14:06:31 2016
@@ -216,8 +216,24 @@ public class SegmentBufferWriter impleme
      * @param recordId the record id
      */
     public void writeRecordId(RecordId recordId) {
+        writeRecordId(recordId, true);
+    }
+
+    /**
+     * Write a record ID. Optionally, mark this record ID as being a reference.
+     * If a record ID is marked as a reference, the referenced record can't be a
+     * root record in this segment.
+     *
+     * @param recordId  the record ID.
+     * @param reference {@code true} if this record ID is a reference, {@code
+     *                  false} otherwise.
+     */
+    public void writeRecordId(RecordId recordId, boolean reference) {
         checkNotNull(recordId);
-        roots.remove(recordId);
+
+        if (reference) {
+            roots.remove(recordId);
+        }
 
         int offset = recordId.getOffset();
         checkState(0 <= offset && offset < MAX_SEGMENT_SIZE);

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentSizeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentSizeTest.java?rev=1750801&r1=1750800&r2=1750801&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentSizeTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentSizeTest.java Thu Jun 30 14:06:31 2016
@@ -151,7 +151,7 @@ public class SegmentSizeTest {
         deny.setProperty("rep:principalName", "everyone");
         deny.setProperty(PropertyStates.createProperty(
                 "rep:privileges", ImmutableList.of("jcr:read"), Type.NAMES));
-        expectSize(224, builder);
+        expectSize(240, builder);
         expectAmortizedSize(40, builder);
 
         NodeBuilder allow = builder.child("allow");
@@ -168,7 +168,7 @@ public class SegmentSizeTest {
         deny0.setProperty("rep:glob", "*/activities/*");
         builder.setProperty(PropertyStates.createProperty(
                 "rep:privileges", ImmutableList.of("jcr:read"), Type.NAMES));
-        expectSize(464, builder);
+        expectSize(480, builder);
         expectAmortizedSize(136, builder);
 
         NodeBuilder allow0 = builder.child("allow0");

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/NodeRecordTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/NodeRecordTest.java?rev=1750801&r1=1750800&r2=1750801&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/NodeRecordTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/NodeRecordTest.java Thu Jun 30 14:06:31 2016
@@ -23,7 +23,8 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.segment.RecordType;
 import org.apache.jackrabbit.oak.segment.Segment;
 import org.apache.jackrabbit.oak.segment.SegmentNodeState;
-import org.junit.Ignore;
+import org.apache.jackrabbit.oak.segment.SegmentWriter;
+import org.apache.jackrabbit.oak.segment.SegmentWriterBuilder;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
@@ -38,10 +39,12 @@ public class NodeRecordTest {
     }
 
     @Test
-    @Ignore("OAK-4525")
-    public void newNodeRecordShouldBeRoot() throws Exception {
+    public void unreferencedNodeRecordShouldBeRoot() throws Exception {
         try (FileStore store = newFileStore()) {
-            assertTrue(isRootRecord(store.getWriter().writeNode(EmptyNodeState.EMPTY_NODE)));
+            SegmentWriter writer = SegmentWriterBuilder.segmentWriterBuilder("test").build(store);
+            SegmentNodeState state = writer.writeNode(EmptyNodeState.EMPTY_NODE);
+            writer.flush();
+            assertTrue(isRootRecord(state));
         }
     }