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 ju...@apache.org on 2013/02/14 17:19:36 UTC

svn commit: r1446262 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/segment/ test/java/org/apache/jackrabbit/oak/plugins/segment/

Author: jukka
Date: Thu Feb 14 16:19:35 2013
New Revision: 1446262

URL: http://svn.apache.org/r1446262
Log:
OAK-593: Segment-based MK

Fix some corner cases in cross-segment references

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/RecordTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java?rev=1446262&r1=1446261&r2=1446262&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java Thu Feb 14 16:19:35 2013
@@ -20,20 +20,14 @@ import static com.google.common.base.Pre
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
 
 import org.apache.jackrabbit.oak.api.PropertyState;
-import org.apache.jackrabbit.oak.plugins.memory.MemoryChildNodeEntry;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeBuilder;
-import org.apache.jackrabbit.oak.plugins.segment.MapRecord.Entry;
 import org.apache.jackrabbit.oak.spi.state.AbstractNodeState;
 import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-
 class SegmentNodeState extends AbstractNodeState {
 
     public static RecordId getRecordIdIfAvailable(NodeState state) {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java?rev=1446262&r1=1446261&r2=1446262&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java Thu Feb 14 16:19:35 2013
@@ -102,13 +102,14 @@ public class SegmentWriter {
         Set<UUID> segmentIds = new HashSet<UUID>();
         for (RecordId id : ids) {
             UUID segmentId = id.getSegmentId();
-            if (!uuid.equals(segmentId) && !uuids.contains(segmentId)) {
+            if (!uuids.contains(segmentId)) {
                 segmentIds.add(segmentId);
             }
         }
 
         int fullSize = size + 4 * ids.size();
-        if (buffer.position() + fullSize > store.getMaxSegmentSize()) {
+        if (buffer.position() + fullSize > store.getMaxSegmentSize()
+                || uuids.size() + segmentIds.size() > 0x100) {
             flush();
         }
         if (fullSize > buffer.remaining()) {
@@ -131,6 +132,8 @@ public class SegmentWriter {
             index = uuids.size();
             uuids.add(segmentId);
         }
+        checkState(index < (1 << 8));
+        checkState(id.getOffset() < (1 << 24));
         buffer.putInt(index << 24 | id.getOffset());
     }
 
@@ -218,7 +221,7 @@ public class SegmentWriter {
                 ids.add(entry.value);
             }
 
-            RecordId bucketId = prepare(4 + entries.size() * 12, ids);
+            RecordId bucketId = prepare(4 + entries.size() * 4, ids);
             buffer.putInt(entries.size());
             for (MapEntry entry : entries) {
                 buffer.putInt(entry.hashCode);
@@ -249,7 +252,7 @@ public class SegmentWriter {
                 }
             }
 
-            RecordId bucketId = prepare(12 + bucketIds.size() * 4, bucketIds);
+            RecordId bucketId = prepare(12, bucketIds);
             buffer.putInt(entries.size());
             buffer.putLong(bucketMap);
             for (RecordId id : bucketIds) {

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/RecordTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/RecordTest.java?rev=1446262&r1=1446261&r2=1446262&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/RecordTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/RecordTest.java Thu Feb 14 16:19:35 2013
@@ -26,12 +26,16 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Arrays;
+import java.util.Calendar;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
 
+import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeState;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.junit.Test;
 
 import com.google.common.base.Charsets;
@@ -219,4 +223,40 @@ public class RecordTest {
         assertNull(many.getEntry(reader, "foo"));
     }
 
+    @Test
+    public void testEmptyNode() {
+        NodeState before = MemoryNodeState.EMPTY_NODE;
+        RecordId id = writer.writeNode(before);
+        writer.flush();
+        NodeState after = new SegmentNodeState(reader, id);
+        assertEquals(before, after);
+    }
+
+    @Test
+    public void testSimpleNode() {
+        NodeState before = MemoryNodeState.EMPTY_NODE.builder()
+                .setProperty("foo", "abc")
+                .setProperty("bar", 123)
+                .setProperty("baz", Math.PI)
+                .getNodeState();
+        RecordId id = writer.writeNode(before);
+        writer.flush();
+        NodeState after = new SegmentNodeState(reader, id);
+        assertEquals(before, after);
+    }
+
+    @Test
+    public void testDeepNode() {
+        NodeBuilder root = MemoryNodeState.EMPTY_NODE.builder();
+        NodeBuilder builder = root;
+        for (int i = 0; i < 1000; i++) {
+            builder = builder.child("test");
+        }
+         NodeState before = builder.getNodeState();
+        RecordId id = writer.writeNode(before);
+        writer.flush();
+        NodeState after = new SegmentNodeState(reader, id);
+        assertEquals(before, after);
+    }
+
 }