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/03/05 17:13:53 UTC

svn commit: r1452877 - 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: Tue Mar  5 16:13:53 2013
New Revision: 1452877

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

Make SegmentNodeState and Template use Segments instead of SegmentReader for increased locality of access

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapEntry.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MemoryStore.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MongoStore.java
    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/SegmentNodeStore.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreBranch.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentPropertyState.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Template.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/RecordTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentSizeTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapEntry.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapEntry.java?rev=1452877&r1=1452876&r2=1452877&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapEntry.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapEntry.java Tue Mar  5 16:13:53 2013
@@ -59,7 +59,7 @@ class MapEntry extends AbstractChildNode
     @Override @Nonnull
     public NodeState getNodeState() {
         checkState(value != null);
-        return new SegmentNodeState(new SegmentReader(store), value);
+        return new SegmentNodeState(store, value);
     }
 
     //---------------------------------------------------------< Map.Entry >--

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MemoryStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MemoryStore.java?rev=1452877&r1=1452876&r2=1452877&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MemoryStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MemoryStore.java Tue Mar  5 16:13:53 2013
@@ -46,8 +46,7 @@ public class MemoryStore implements Segm
             this.store = checkNotNull(store);
             this.parent = null;
 
-            SegmentWriter writer =
-                    new SegmentWriter(store, new SegmentReader(store));
+            SegmentWriter writer = new SegmentWriter(store);
             RecordId id = writer.writeNode(root).getRecordId();
             writer.flush();
 
@@ -80,15 +79,14 @@ public class MemoryStore implements Segm
         @Override
         public synchronized void merge() {
             if (parent != null) {
-                SegmentReader reader = new SegmentReader(store);
-                NodeState before = new SegmentNodeState(reader, base);
-                NodeState after = new SegmentNodeState(reader, head);
+                NodeState before = new SegmentNodeState(store, base);
+                NodeState after = new SegmentNodeState(store, head);
 
-                SegmentWriter writer = new SegmentWriter(store, reader);
+                SegmentWriter writer = new SegmentWriter(store);
                 while (!parent.setHead(base, head)) {
                     RecordId newBase = parent.getHead();
                     NodeBuilder builder =
-                            new SegmentNodeState(reader, newBase).builder();
+                            new SegmentNodeState(store, newBase).builder();
                     after.compareAgainstBaseState(
                             before, new RebaseDiff(builder));
                     NodeState state = builder.getNodeState();

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MongoStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MongoStore.java?rev=1452877&r1=1452876&r2=1452877&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MongoStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MongoStore.java Tue Mar  5 16:13:53 2013
@@ -45,7 +45,7 @@ public class MongoStore implements Segme
         this.cache = cache;
 
         if (journals.findOne(new BasicDBObject("_id", "root")) == null) {
-            SegmentWriter writer = new SegmentWriter(this, new SegmentReader(this));
+            SegmentWriter writer = new SegmentWriter(this);
             RecordId id = writer.writeNode(MemoryNodeState.EMPTY_NODE).getRecordId();
             writer.flush();
             journals.insert(new BasicDBObject(ImmutableMap.of(

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=1452877&r1=1452876&r2=1452877&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 Tue Mar  5 16:13:53 2013
@@ -31,14 +31,14 @@ import org.apache.jackrabbit.oak.spi.sta
 
 class SegmentNodeState extends AbstractNodeState {
 
-    private final SegmentReader reader;
+    private final SegmentStore store;
 
     private final RecordId recordId;
 
     private Template template = null;
 
-    SegmentNodeState(SegmentReader reader, RecordId id) {
-        this.reader = checkNotNull(reader);
+    SegmentNodeState(SegmentStore store, RecordId id) {
+        this.store = checkNotNull(store);
         this.recordId = checkNotNull(id);
     }
 
@@ -48,7 +48,7 @@ class SegmentNodeState extends AbstractN
 
     private synchronized Template getTemplate() {
         if (template == null) {
-            Segment segment = reader.getStore().readSegment(recordId.getSegmentId());
+            Segment segment = store.readSegment(recordId.getSegmentId());
             RecordId templateId = segment.readRecordId(recordId.getOffset());
             template = segment.readTemplate(templateId);
         }
@@ -56,7 +56,7 @@ class SegmentNodeState extends AbstractN
     }
 
     MapRecord getChildNodeMap() {
-        return getTemplate().getChildNodeMap(reader, recordId);
+        return getTemplate().getChildNodeMap(store, recordId);
     }
 
     @Override
@@ -67,37 +67,37 @@ class SegmentNodeState extends AbstractN
     @Override @CheckForNull
     public PropertyState getProperty(String name) {
         checkNotNull(name);
-        return getTemplate().getProperty(name, reader, recordId);
+        return getTemplate().getProperty(name, store, recordId);
     }
 
     @Override @Nonnull
     public Iterable<PropertyState> getProperties() {
-        return getTemplate().getProperties(reader, recordId);
+        return getTemplate().getProperties(store, recordId);
     }
 
     @Override
     public long getChildNodeCount() {
-        return getTemplate().getChildNodeCount(reader, recordId);
+        return getTemplate().getChildNodeCount(store, recordId);
     }
 
     @Override
     public boolean hasChildNode(String name) {
-        return getTemplate().hasChildNode(checkNotNull(name), reader, recordId);
+        return getTemplate().hasChildNode(checkNotNull(name), store, recordId);
     }
 
     @Override @CheckForNull
     public NodeState getChildNode(String name) {
-        return getTemplate().getChildNode(checkNotNull(name), reader, recordId);
+        return getTemplate().getChildNode(checkNotNull(name), store, recordId);
     }
 
     @Override
     public Iterable<String> getChildNodeNames() {
-        return getTemplate().getChildNodeNames(reader, recordId);
+        return getTemplate().getChildNodeNames(store, recordId);
     }
 
     @Override @Nonnull
     public Iterable<? extends ChildNodeEntry> getChildNodeEntries() {
-        return getTemplate().getChildNodeEntries(reader, recordId);
+        return getTemplate().getChildNodeEntries(store, recordId);
     }
 
     @Override @Nonnull
@@ -111,7 +111,7 @@ class SegmentNodeState extends AbstractN
             SegmentNodeState that = (SegmentNodeState) base;
             if (!recordId.equals(that.recordId)) {
                 getTemplate().compareAgainstBaseState(
-                        reader, recordId, that.getTemplate(), that.recordId,
+                        store, recordId, that.getTemplate(), that.recordId,
                         diff);
             }
         } else {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java?rev=1452877&r1=1452876&r2=1452877&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java Tue Mar  5 16:13:53 2013
@@ -46,17 +46,17 @@ public class SegmentNodeStore implements
 
     @Override @Nonnull
     public NodeState getRoot() {
-        return new SegmentNodeState(reader, journal.getHead());
+        return new SegmentNodeState(store, journal.getHead());
     }
 
     @Override @Nonnull
     public NodeStoreBranch branch() {
-        return new SegmentNodeStoreBranch(store, journal, reader);
+        return new SegmentNodeStoreBranch(store, journal);
     }
 
     @Override
     public Blob createBlob(InputStream stream) throws IOException {
-        SegmentWriter writer = new SegmentWriter(store, reader);
+        SegmentWriter writer = new SegmentWriter(store);
         RecordId recordId = writer.writeStream(stream);
         writer.flush();
         return new SegmentBlob(reader, recordId);

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreBranch.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreBranch.java?rev=1452877&r1=1452876&r2=1452877&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreBranch.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreBranch.java Tue Mar  5 16:13:53 2013
@@ -33,9 +33,9 @@ class SegmentNodeStoreBranch implements 
 
     private static final Random RANDOM = new Random();
 
-    private final Journal journal;
+    private final SegmentStore store;
 
-    private final SegmentReader reader;
+    private final Journal journal;
 
     private final SegmentWriter writer;
 
@@ -43,23 +43,22 @@ class SegmentNodeStoreBranch implements 
 
     private RecordId rootId;
 
-    SegmentNodeStoreBranch(
-            SegmentStore store, Journal journal, SegmentReader reader) {
+    SegmentNodeStoreBranch(SegmentStore store, Journal journal) {
+        this.store = store;
         this.journal = journal;
-        this.reader = reader;
-        this.writer = new SegmentWriter(store, reader);
+        this.writer = new SegmentWriter(store);
         this.baseId = journal.getHead();
         this.rootId = baseId;
     }
 
     @Override @Nonnull
     public NodeState getBase() {
-        return new SegmentNodeState(reader, baseId);
+        return new SegmentNodeState(store, baseId);
     }
 
     @Override @Nonnull
     public synchronized NodeState getHead() {
-        return new SegmentNodeState(reader, rootId);
+        return new SegmentNodeState(store, rootId);
     }
 
     @Override
@@ -73,7 +72,7 @@ class SegmentNodeStoreBranch implements 
         RecordId newBaseId = journal.getHead();
         if (!baseId.equals(newBaseId)) {
             NodeBuilder builder =
-                    new MemoryNodeBuilder(new SegmentNodeState(reader, newBaseId));
+                    new MemoryNodeBuilder(new SegmentNodeState(store, newBaseId));
             getHead().compareAgainstBaseState(getBase(), new RebaseDiff(builder));
             this.baseId = newBaseId;
             this.rootId = writer.writeNode(builder.getNodeState()).getRecordId();

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentPropertyState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentPropertyState.java?rev=1452877&r1=1452876&r2=1452877&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentPropertyState.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentPropertyState.java Tue Mar  5 16:13:53 2013
@@ -34,15 +34,14 @@ class SegmentPropertyState extends Abstr
 
     private final PropertyTemplate template;
 
-    private final SegmentReader reader;
+    private final SegmentStore store;
 
     private final RecordId recordId;
 
     public SegmentPropertyState(
-            PropertyTemplate template,
-            SegmentReader reader, RecordId recordId) {
+            PropertyTemplate template, SegmentStore store, RecordId recordId) {
         this.template = checkNotNull(template);
-        this.reader = checkNotNull(reader);
+        this.store = checkNotNull(store);
         this.recordId = checkNotNull(recordId);
     }
 
@@ -64,7 +63,8 @@ class SegmentPropertyState extends Abstr
     @Override
     public int count() {
         if (isArray()) {
-            return reader.readInt(recordId, 0);
+            Segment segment = store.readSegment(recordId.getSegmentId());
+            return segment.readInt(recordId.getOffset());
         } else {
             return 1;
         }
@@ -114,7 +114,7 @@ class SegmentPropertyState extends Abstr
         checkNotNull(type);
         checkArgument(!type.isArray(), "Type must not be an array type");
 
-        Segment segment = reader.getStore().readSegment(recordId.getSegmentId());
+        Segment segment = store.readSegment(recordId.getSegmentId());
 
         Type<?> base = getType();
         ListRecord values;
@@ -128,6 +128,7 @@ class SegmentPropertyState extends Abstr
         }
         checkElementIndex(index, values.size());
 
+        SegmentReader reader = new SegmentReader(store);
         RecordId valueId = values.getEntry(reader, index);
         if (type == Type.BINARY) {
             return (T) new SegmentBlob(reader, valueId);
@@ -170,13 +171,15 @@ class SegmentPropertyState extends Abstr
     public long size(int index) {
         ListRecord values;
         if (isArray()) {
-            int size = reader.readInt(recordId, 0);
-            RecordId listId = reader.readRecordId(recordId, 4);
+            Segment segment = store.readSegment(recordId.getSegmentId());
+            int size = segment.readInt(recordId.getOffset());
+            RecordId listId = segment.readRecordId(recordId.getOffset() + 4);
             values = new ListRecord(listId, size);
         } else {
             values = new ListRecord(recordId, 1);
         }
         checkElementIndex(index, values.size());
+        SegmentReader reader = new SegmentReader(store);
         return reader.readLength(values.getEntry(reader, 0));
     }
 

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=1452877&r1=1452876&r2=1452877&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 Tue Mar  5 16:13:53 2013
@@ -59,8 +59,6 @@ public class SegmentWriter {
 
     private final SegmentStore store;
 
-    private final SegmentReader reader;
-
     private final Map<String, RecordId> strings = Maps.newHashMap();
 
     private final Map<Template, RecordId> templates = Maps.newHashMap();
@@ -95,9 +93,8 @@ public class SegmentWriter {
      */
     private int position;
 
-    public SegmentWriter(SegmentStore store, SegmentReader reader) {
+    public SegmentWriter(SegmentStore store) {
         this.store = store;
-        this.reader = reader;
     }
 
     public synchronized void flush() {
@@ -678,7 +675,7 @@ public class SegmentWriter {
         for (RecordId id : ids) {
             writeRecordId(id);
         }
-        return new SegmentNodeState(reader, recordId);
+        return new SegmentNodeState(store, recordId);
     }
 
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Template.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Template.java?rev=1452877&r1=1452876&r2=1452877&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Template.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Template.java Tue Mar  5 16:13:53 2013
@@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.plugin
 import static com.google.common.base.Preconditions.checkElementIndex;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
+import static org.apache.jackrabbit.oak.plugins.segment.Segment.RECORD_ID_BYTES;
 
 import java.util.Arrays;
 import java.util.Collections;
@@ -176,7 +177,7 @@ class Template {
     }
 
     public PropertyState getProperty(
-            String name, SegmentReader reader, RecordId recordId) {
+            String name, SegmentStore store, RecordId recordId) {
         if ("jcr:primaryType".equals(name) && primaryType != null) {
             return primaryType;
         } else if ("jcr:mixinTypes".equals(name) && mixinTypes != null) {
@@ -191,7 +192,7 @@ class Template {
             while (index < properties.length
                     && properties[index].getName().hashCode() == hash) {
                 if (name.equals(properties[index].getName())) {
-                    return getProperty(reader, recordId, index);
+                    return getProperty(store, recordId, index);
                 }
                 index++;
             }
@@ -200,22 +201,23 @@ class Template {
     }
 
     private PropertyState getProperty(
-            SegmentReader reader, RecordId recordId, int index) {
-        checkNotNull(reader);
+            SegmentStore store, RecordId recordId, int index) {
+        checkNotNull(store);
         checkNotNull(recordId);
         checkElementIndex(index, properties.length);
 
-        int offset = 1;
+        int offset = recordId.getOffset() + RECORD_ID_BYTES;
         if (!hasNoChildNodes()) {
-            offset++;
+            offset += RECORD_ID_BYTES;
         }
+        offset += index * RECORD_ID_BYTES;
+        Segment segment = store.readSegment(recordId.getSegmentId());
         return new SegmentPropertyState(
-                properties[index], reader, reader.readRecordId(
-                        recordId, (offset + index) * Segment.RECORD_ID_BYTES));
+                properties[index], store, segment.readRecordId(offset));
     }
 
     public Iterable<PropertyState> getProperties(
-            SegmentReader reader, RecordId recordId) {
+            SegmentStore store, RecordId recordId) {
         List<PropertyState> list =
                 Lists.newArrayListWithCapacity(properties.length + 2);
         if (primaryType != null) {
@@ -224,44 +226,45 @@ class Template {
         if (mixinTypes != null) {
             list.add(mixinTypes);
         }
-        int offset = 1;
+        int offset = recordId.getOffset() + RECORD_ID_BYTES;
         if (!hasNoChildNodes()) {
-            offset++;
+            offset += RECORD_ID_BYTES;
         }
+        Segment segment = store.readSegment(recordId.getSegmentId());
         for (int i = 0; i < properties.length; i++) {
-            RecordId propertyId = reader.readRecordId(
-                    recordId, (offset + i) * Segment.RECORD_ID_BYTES);
+            RecordId propertyId = segment.readRecordId(offset);
             list.add(new SegmentPropertyState(
-                    properties[i], reader, propertyId));
+                    properties[i], store, propertyId));
+            offset += RECORD_ID_BYTES;
         }
         return list;
     }
 
-    public long getChildNodeCount(SegmentReader reader, RecordId recordId) {
+    public long getChildNodeCount(SegmentStore store, RecordId recordId) {
         if (hasNoChildNodes()) {
             return 0;
         } else if (hasManyChildNodes()) {
-            RecordId childNodesId =
-                    reader.readRecordId(recordId, Segment.RECORD_ID_BYTES);
-            return MapRecord.readMap(reader.getStore(), childNodesId).size();
+            MapRecord map = getChildNodeMap(store, recordId);
+            return map.size();
         } else {
             return 1;
         }
     }
 
-    MapRecord getChildNodeMap(SegmentReader reader, RecordId recordId) {
+    MapRecord getChildNodeMap(SegmentStore store, RecordId recordId) {
         checkState(hasManyChildNodes());
-        return MapRecord.readMap(
-                reader.getStore(),
-                reader.readRecordId(recordId, Segment.RECORD_ID_BYTES));
+        int offset = recordId.getOffset() + RECORD_ID_BYTES;
+        Segment segment = store.readSegment(recordId.getSegmentId());
+        RecordId childNodesId = segment.readRecordId(offset);
+        return MapRecord.readMap(store, childNodesId);
     }
 
     public boolean hasChildNode(
-            String name, SegmentReader reader, RecordId recordId) {
+            String name, SegmentStore store, RecordId recordId) {
         if (hasNoChildNodes()) {
             return false;
         } else if (hasManyChildNodes()) {
-            MapRecord map = getChildNodeMap(reader, recordId);
+            MapRecord map = getChildNodeMap(store, recordId);
             return map.getEntry(name) != null;
         } else {
             return name.equals(childName);
@@ -269,56 +272,59 @@ class Template {
     }
 
     public NodeState getChildNode(
-            String name, SegmentReader reader, RecordId recordId) {
+            String name, SegmentStore store, RecordId recordId) {
         if (hasNoChildNodes()) {
             return null;
         } else if (hasManyChildNodes()) {
-            RecordId childNodeId =
-                    getChildNodeMap(reader, recordId).getEntry(name);
+            MapRecord map = getChildNodeMap(store, recordId);
+            RecordId childNodeId = map.getEntry(name);
             if (childNodeId != null) {
-                return new SegmentNodeState(reader, childNodeId);
+                return new SegmentNodeState(store, childNodeId);
             } else {
                 return null;
             }
         } else if (name.equals(childName)) {
-            RecordId childNodeId =
-                    reader.readRecordId(recordId, Segment.RECORD_ID_BYTES);
-            return new SegmentNodeState(reader, childNodeId);
+            int offset = recordId.getOffset() + RECORD_ID_BYTES;
+            Segment segment = store.readSegment(recordId.getSegmentId());
+            RecordId childNodeId = segment.readRecordId(offset);
+            return new SegmentNodeState(store, childNodeId);
         } else {
             return null;
         }
     }
 
-    public Iterable<String> getChildNodeNames(
-            SegmentReader reader, RecordId recordId) {
+    Iterable<String> getChildNodeNames(SegmentStore store, RecordId recordId) {
         if (hasNoChildNodes()) {
             return Collections.emptyList();
         } else if (hasManyChildNodes()) {
-            return getChildNodeMap(reader, recordId).getKeys();
+            MapRecord map = getChildNodeMap(store, recordId);
+            return map.getKeys();
         } else {
             return Collections.singletonList(childName);
         }
     }
 
-    public Iterable<? extends ChildNodeEntry> getChildNodeEntries(
-            final SegmentReader reader, RecordId recordId) {
+    Iterable<? extends ChildNodeEntry> getChildNodeEntries(
+            SegmentStore store, RecordId recordId) {
         if (hasNoChildNodes()) {
             return Collections.emptyList();
         } else if (hasManyChildNodes()) {
-            return getChildNodeMap(reader, recordId).getEntries();
+            MapRecord map = getChildNodeMap(store, recordId);
+            return map.getEntries();
         } else {
-            RecordId childNodeId =
-                    reader.readRecordId(recordId, Segment.RECORD_ID_BYTES);
+            int offset = recordId.getOffset() + RECORD_ID_BYTES;
+            Segment segment = store.readSegment(recordId.getSegmentId());
+            RecordId childNodeId = segment.readRecordId(offset);
             return Collections.singletonList(new MemoryChildNodeEntry(
-                    childName, new SegmentNodeState(reader, childNodeId)));
+                    childName, new SegmentNodeState(store, childNodeId)));
         }
     }
 
     public void compareAgainstBaseState(
-            SegmentReader reader, RecordId afterId,
+            SegmentStore store, RecordId afterId,
             Template beforeTemplate, RecordId beforeId,
             NodeStateDiff diff) {
-        checkNotNull(reader);
+        checkNotNull(store);
         checkNotNull(afterId);
         checkNotNull(beforeTemplate);
         checkNotNull(beforeId);
@@ -342,37 +348,37 @@ class Template {
             PropertyState beforeProperty = null;
             PropertyState afterProperty = null;
             if (d < 0) {
-                afterProperty = getProperty(reader, afterId, afterIndex++);
+                afterProperty = getProperty(store, afterId, afterIndex++);
             } else if (d > 0) {
                 beforeProperty = beforeTemplate.getProperty(
-                        reader, beforeId, beforeIndex++);
+                        store, beforeId, beforeIndex++);
             } else {
-                afterProperty = getProperty(reader, afterId, afterIndex++);
+                afterProperty = getProperty(store, afterId, afterIndex++);
                 beforeProperty = beforeTemplate.getProperty(
-                        reader, beforeId, beforeIndex++);
+                        store, beforeId, beforeIndex++);
             }
             compareProperties(beforeProperty, afterProperty, diff);
         }
         while (afterIndex < properties.length) {
-            diff.propertyAdded(getProperty(reader, afterId, afterIndex++));
+            diff.propertyAdded(getProperty(store, afterId, afterIndex++));
         }
         while (beforeIndex < beforeTemplate.properties.length) {
             diff.propertyDeleted(beforeTemplate.getProperty(
-                    reader, beforeId, beforeIndex++));
+                    store, beforeId, beforeIndex++));
         }
 
         if (hasNoChildNodes()) {
             if (!beforeTemplate.hasNoChildNodes()) {
                 for (ChildNodeEntry entry :
-                        beforeTemplate.getChildNodeEntries(reader, beforeId)) {
+                        beforeTemplate.getChildNodeEntries(store, beforeId)) {
                     diff.childNodeDeleted(
                             entry.getName(), entry.getNodeState());
                 }
             }
         } else if (hasOneChildNode()) {
-            NodeState afterNode = getChildNode(childName, reader, afterId);
+            NodeState afterNode = getChildNode(childName, store, afterId);
             NodeState beforeNode = beforeTemplate.getChildNode(
-                    childName, reader, beforeId);
+                    childName, store, beforeId);
             if (beforeNode == null) {
                 diff.childNodeAdded(childName, afterNode);
             } else if (!beforeNode.equals(afterNode)) {
@@ -381,7 +387,7 @@ class Template {
             if ((beforeTemplate.hasOneChildNode() && beforeNode == null)
                     || beforeTemplate.hasManyChildNodes()) {
                 for (ChildNodeEntry entry :
-                    beforeTemplate.getChildNodeEntries(reader, beforeId)) {
+                    beforeTemplate.getChildNodeEntries(store, beforeId)) {
                     if (!childName.equals(entry.getName())) {
                         diff.childNodeDeleted(
                                 entry.getName(), entry.getNodeState());
@@ -392,10 +398,10 @@ class Template {
             // TODO: Leverage the HAMT data structure for the comparison
             Set<String> baseChildNodes = new HashSet<String>();
             for (ChildNodeEntry beforeCNE
-                    : beforeTemplate.getChildNodeEntries(reader, beforeId)) {
+                    : beforeTemplate.getChildNodeEntries(store, beforeId)) {
                 String name = beforeCNE.getName();
                 NodeState beforeChild = beforeCNE.getNodeState();
-                NodeState afterChild = getChildNode(name, reader, afterId);
+                NodeState afterChild = getChildNode(name, store, afterId);
                 if (afterChild == null) {
                     diff.childNodeDeleted(name, beforeChild);
                 } else {
@@ -406,7 +412,7 @@ class Template {
                 }
             }
             for (ChildNodeEntry afterChild
-                    : getChildNodeEntries(reader, afterId)) {
+                    : getChildNodeEntries(store, afterId)) {
                 String name = afterChild.getName();
                 if (!baseChildNodes.contains(name)) {
                     diff.childNodeAdded(name, afterChild.getNodeState());

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java?rev=1452877&r1=1452876&r2=1452877&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java Tue Mar  5 16:13:53 2013
@@ -31,9 +31,7 @@ public class CompareAgainstBaseStateTest
 
     private final SegmentStore store = new MemoryStore();
 
-    private final SegmentReader reader = new SegmentReader(store);
-
-    private final SegmentWriter writer = new SegmentWriter(store, reader);
+    private final SegmentWriter writer = new SegmentWriter(store);
 
     private final NodeStateDiff diff = EasyMock.createMock(NodeStateDiff.class);
 

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=1452877&r1=1452876&r2=1452877&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 Tue Mar  5 16:13:53 2013
@@ -51,7 +51,7 @@ public class RecordTest {
 
     private SegmentReader reader = new SegmentReader(store);
 
-    private SegmentWriter writer = new SegmentWriter(store, reader);
+    private SegmentWriter writer = new SegmentWriter(store);
 
     private final Random random = new Random(0xcafefaceL);
 

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=1452877&r1=1452876&r2=1452877&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 Tue Mar  5 16:13:53 2013
@@ -145,8 +145,7 @@ public class SegmentSizeTest {
     @Test
     public void testFlatNodeUpdate() {
         SegmentStore store = new MemoryStore();
-        SegmentReader reader = new SegmentReader(store);
-        SegmentWriter writer = new SegmentWriter(store, reader);
+        SegmentWriter writer = new SegmentWriter(store);
 
         NodeBuilder builder = MemoryNodeState.EMPTY_NODE.builder();
         for (int i = 0; i < 1000; i++) {
@@ -168,7 +167,7 @@ public class SegmentSizeTest {
 
     private int getSize(NodeBuilder builder) {
         SegmentStore store = new MemoryStore();
-        SegmentWriter writer = new SegmentWriter(store, new SegmentReader(store));
+        SegmentWriter writer = new SegmentWriter(store);
         RecordId id = writer.writeNode(builder.getNodeState()).getRecordId();
         writer.flush();
         Segment segment = store.readSegment(id.getSegmentId());
@@ -177,7 +176,7 @@ public class SegmentSizeTest {
 
     private int getAmortizedSize(NodeBuilder builder) {
         SegmentStore store = new MemoryStore();
-        SegmentWriter writer = new SegmentWriter(store, new SegmentReader(store));
+        SegmentWriter writer = new SegmentWriter(store);
         NodeState state = builder.getNodeState();
         RecordId id = writer.writeNode(state).getRecordId();
         writer.flush();