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/10/03 04:17:46 UTC

svn commit: r1528702 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment: MapBranch.java MapEntry.java MapLeaf.java MapRecord.java Template.java

Author: jukka
Date: Thu Oct  3 02:17:45 2013
New Revision: 1528702

URL: http://svn.apache.org/r1528702
Log:
OAK-1031: SegmentMK: Fewer segment lookups

Pass MapEntries to MapDiff in order to keep the local segment reference along with the raw record identifiers

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapBranch.java
    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/MapLeaf.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapRecord.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Template.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapBranch.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapBranch.java?rev=1528702&r1=1528701&r2=1528702&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapBranch.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapBranch.java Thu Oct  3 02:17:45 2013
@@ -139,7 +139,7 @@ class MapBranch extends MapRecord {
                 if (beforeBuckets[i] != null) {
                     MapRecord map = beforeSegment.readMap(beforeBuckets[i]);
                     for (MapEntry entry : map.getEntries()) {
-                        if (!diff.entryDeleted(entry.getName(), entry.getValue())) {
+                        if (!diff.entryDeleted(entry)) {
                             return false;
                         }
                     }
@@ -147,7 +147,7 @@ class MapBranch extends MapRecord {
             } else if (beforeBuckets[i] == null) {
                 MapRecord map = afterSegment.readMap(afterBuckets[i]);
                 for (MapEntry entry : map.getEntries()) {
-                    if (!diff.entryAdded(entry.getName(), entry.getValue())) {
+                    if (!diff.entryAdded(entry)) {
                         return false;
                     }
                 }

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=1528702&r1=1528701&r2=1528702&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 Thu Oct  3 02:17:45 2013
@@ -24,7 +24,6 @@ import java.util.Map;
 import javax.annotation.Nonnull;
 
 import org.apache.jackrabbit.oak.spi.state.AbstractChildNodeEntry;
-import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 import com.google.common.collect.ComparisonChain;
 
@@ -61,7 +60,7 @@ class MapEntry extends AbstractChildNode
     }
 
     @Override @Nonnull
-    public NodeState getNodeState() {
+    public SegmentNodeState getNodeState() {
         checkState(value != null);
         return new SegmentNodeState(segment, value);
     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapLeaf.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapLeaf.java?rev=1528702&r1=1528701&r2=1528702&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapLeaf.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapLeaf.java Thu Oct  3 02:17:45 2013
@@ -127,8 +127,7 @@ class MapLeaf extends MapRecord {
                     && (before.getHash(bs, bi) < afterHash
                         || (before.getHash(bs, bi) == afterHash
                             && before.getKey(bs, bi).compareTo(afterKey) < 0))) {
-                if (!diff.entryDeleted(
-                        before.getKey(bs, bi), before.getValue(bs, bi))) {
+                if (!diff.entryDeleted(before.getEntry(bs, bi))) {
                     return false;
                 }
                 bi++;
@@ -139,11 +138,13 @@ class MapLeaf extends MapRecord {
                     && before.getKey(bs, bi).equals(afterKey)) {
                 RecordId beforeValue = before.getValue(bs, bi);
                 if (!afterValue.equals(beforeValue)
-                        && !diff.entryChanged(afterKey, beforeValue, afterValue)) {
+                        && !diff.entryChanged(
+                                before.getEntry(bs, bi),
+                                after.getEntry(as, ai))) {
                     return false;
                 }
                 bi++;
-            } else if (!diff.entryAdded(afterKey, afterValue)) {
+            } else if (!diff.entryAdded(after.getEntry(as, ai))) {
                 return false;
             }
 
@@ -151,8 +152,7 @@ class MapLeaf extends MapRecord {
         }
 
         while (bi < before.size) {
-            if (!diff.entryDeleted(
-                    before.getKey(bs, bi), before.getValue(bs, bi))) {
+            if (!diff.entryDeleted(before.getEntry(bs, bi))) {
                 return false;
             }
             bi++;
@@ -163,6 +163,15 @@ class MapLeaf extends MapRecord {
 
     //-----------------------------------------------------------< private >--
 
+    private MapEntry getEntry(Segment segment, int index) {
+        checkNotNull(segment);
+        RecordId key =
+                segment.readRecordId(getOffset(4 + size * 4, index));
+        RecordId value =
+                segment.readRecordId(getOffset(4 + size * 4, size + index));
+        return new MapEntry(segment, segment.readString(key), key, value);
+    }
+
     private int getHash(Segment segment, int index) {
         return checkNotNull(segment).readInt(getOffset() + 4 + index * 4);
     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapRecord.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapRecord.java?rev=1528702&r1=1528701&r2=1528702&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapRecord.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapRecord.java Thu Oct  3 02:17:45 2013
@@ -86,7 +86,7 @@ abstract class MapRecord extends Record 
 
     boolean compareAgainstEmptyMap(MapDiff diff) {
         for (MapEntry entry : getEntries()) {
-            if (!diff.entryAdded(entry.getName(), entry.getValue())) {
+            if (!diff.entryAdded(entry)) {
                 return false;
             }
         }
@@ -94,9 +94,9 @@ abstract class MapRecord extends Record 
     }
 
     interface MapDiff {
-        boolean entryAdded(String key, RecordId after);
-        boolean entryChanged(String key, RecordId before, RecordId after);
-        boolean entryDeleted(String key, RecordId before);
+        boolean entryAdded(MapEntry after);
+        boolean entryChanged(MapEntry before, MapEntry after);
+        boolean entryDeleted(MapEntry before);
     }
 
     boolean compare(MapRecord that, MapDiff diff) {
@@ -105,11 +105,11 @@ abstract class MapRecord extends Record 
             String name = entry.getName();
             MapEntry thatEntry = that.getEntry(name);
             if (thatEntry == null) {
-                if (!diff.entryAdded(name, entry.getValue())) {
+                if (!diff.entryAdded(entry)) {
                     return false;
                 }
             } else if (!entry.getValue().equals(thatEntry.getValue())) {
-                if (!diff.entryChanged(name, thatEntry.getValue(), entry.getValue())) {
+                if (!diff.entryChanged(thatEntry, entry)) {
                     return false;
                 }
             }
@@ -118,7 +118,7 @@ abstract class MapRecord extends Record 
         for (MapEntry entry : that.getEntries()) {
             String name = entry.getName();
             if (!keys.contains(name)) {
-                if (!diff.entryDeleted(name, entry.getValue())) {
+                if (!diff.entryDeleted(entry)) {
                     return false;
                 }
             }

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=1528702&r1=1528701&r2=1528702&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 Thu Oct  3 02:17:45 2013
@@ -396,21 +396,21 @@ public class Template {
             MapRecord beforeMap = beforeTemplate.getChildNodeMap(beforeSegment, beforeId);
             return afterMap.compare(beforeMap, new MapDiff() {
                 @Override
-                public boolean entryAdded(String key, RecordId after) {
+                public boolean entryAdded(MapEntry after) {
                     return diff.childNodeAdded(
-                            key, new SegmentNodeState(afterSegment, after));
+                            after.getName(), after.getNodeState());
                 }
                 @Override
-                public boolean entryChanged(
-                        String key, RecordId before, RecordId after) {
-                    SegmentNodeState b = new SegmentNodeState(beforeSegment, before);
-                    SegmentNodeState a = new SegmentNodeState(afterSegment, after);
-                    return fastEquals(a, b) || diff.childNodeChanged(key, b, a);
+                public boolean entryChanged(MapEntry before, MapEntry after) {
+                    SegmentNodeState b = before.getNodeState();
+                    SegmentNodeState a = after.getNodeState();
+                    return fastEquals(a, b)
+                            || diff.childNodeChanged(before.getName(), b, a);
                 }
                 @Override
-                public boolean entryDeleted(String key, RecordId before) {
+                public boolean entryDeleted(MapEntry before) {
                     return diff.childNodeDeleted(
-                            key, new SegmentNodeState(beforeSegment, before));
+                            before.getName(), before.getNodeState());
                 }
             });
         }
@@ -441,17 +441,16 @@ public class Template {
             final Segment s = segment;
             children.compareAgainstEmptyMap(new MapDiff() {
                 @Override
-                public boolean entryAdded(String key, RecordId after) {
+                public boolean entryAdded(MapEntry after) {
                     return diff.childNodeAdded(
-                            key, new SegmentNodeState(s, after));
+                            after.getName(), after.getNodeState());
                 }
                 @Override
-                public boolean entryChanged(
-                        String key, RecordId before, RecordId after) {
+                public boolean entryChanged(MapEntry before, MapEntry after) {
                     throw new IllegalStateException();
                 }
                 @Override
-                public boolean entryDeleted(String key, RecordId before) {
+                public boolean entryDeleted(MapEntry before) {
                     throw new IllegalStateException();
                 }
             });