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 2014/02/12 11:29:52 UTC

svn commit: r1567586 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment: SegmentWriter.java Template.java

Author: jukka
Date: Wed Feb 12 10:29:52 2014
New Revision: 1567586

URL: http://svn.apache.org/r1567586
Log:
OAK-1392: SegmentBlob.equals() optimization

Reuse previous property records if the value(s) have not changed.
This optimizes the case where a binary value is rewritten without changes.

Modified:
    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

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=1567586&r1=1567585&r2=1567586&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 Wed Feb 12 10:29:52 2014
@@ -32,6 +32,7 @@ import static com.google.common.collect.
 import static java.util.Arrays.asList;
 import static java.util.Collections.emptyMap;
 import static java.util.Collections.nCopies;
+import static org.apache.jackrabbit.oak.api.Type.BINARIES;
 import static org.apache.jackrabbit.oak.api.Type.NAME;
 import static org.apache.jackrabbit.oak.api.Type.NAMES;
 import static org.apache.jackrabbit.oak.plugins.segment.MapRecord.BUCKETS_PER_LEVEL;
@@ -736,6 +737,11 @@ public class SegmentWriter {
         return writeValueRecord(length, writeList(blockIds));
     }
 
+    private RecordId writeProperty(PropertyState state) {
+        Map<String, RecordId> previousValues = emptyMap();
+        return writeProperty(state, previousValues);
+    }
+
     private RecordId writeProperty(
             PropertyState state, Map<String, RecordId> previousValues) {
         Type<?> type = state.getType();
@@ -869,18 +875,20 @@ public class SegmentWriter {
         }
 
         SegmentNodeState before = null;
+        Template beforeTemplate = null;
         ModifiedNodeState after = null;
         if (state instanceof ModifiedNodeState) {
             after = (ModifiedNodeState) state;
             NodeState base = after.getBaseState();
             if (store.isInstance(base, SegmentNodeState.class)) {
                 before = (SegmentNodeState) base;
+                beforeTemplate = before.getTemplate();
             }
         }
 
         Template template = new Template(state);
         RecordId templateId;
-        if (before != null && template.equals(before.getTemplate())) {
+        if (before != null && template.equals(beforeTemplate)) {
             templateId = before.getTemplateId();
         } else {
             templateId = writeTemplate(template);
@@ -934,20 +942,26 @@ public class SegmentWriter {
 
             if (store.isInstance(property, SegmentPropertyState.class)) {
                 ids.add(((SegmentPropertyState) property).getRecordId());
+            } else if (!store.isInstance(before, SegmentNodeState.class)) {
+                ids.add(writeProperty(property));
             } else {
-                Map<String, RecordId> previousValues = emptyMap();
-                if (before != null) {
-                    // reuse previously stored property values, if possible
-                    PropertyState beforeProperty = before.getProperty(name);
-                    if (store.isInstance(beforeProperty, SegmentPropertyState.class)
-                            && beforeProperty.isArray()
-                            && beforeProperty.getType() != Type.BINARIES) {
-                        SegmentPropertyState segmentProperty =
-                                (SegmentPropertyState) beforeProperty;
-                        previousValues = segmentProperty.getValueRecords();
+                // reuse previously stored property, if possible
+                PropertyTemplate bt = beforeTemplate.getPropertyTemplate(name);
+                if (bt == null) {
+                    ids.add(writeProperty(property)); // new property
+                } else {
+                    SegmentPropertyState bp = beforeTemplate.getProperty(
+                            before.getSegment(), before.getRecordId(),
+                            bt.getIndex());
+                    if (property.equals(bp)) {
+                        ids.add(bp.getRecordId()); // no changes
+                    } else if (bp.isArray() && bp.getType() != BINARIES) {
+                        // reuse entries from the previous list
+                        ids.add(writeProperty(property, bp.getValueRecords()));
+                    } else {
+                        ids.add(writeProperty(property));
                     }
                 }
-                ids.add(writeProperty(property, previousValues));
             }
         }
 

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=1567586&r1=1567585&r2=1567586&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 Wed Feb 12 10:29:52 2014
@@ -159,7 +159,7 @@ public class Template {
         return childName;
     }
 
-    PropertyState getProperty(
+    SegmentPropertyState getProperty(
             Segment segment, RecordId recordId, int index) {
         checkElementIndex(index, properties.length);
         segment = checkNotNull(segment).getSegment(checkNotNull(recordId));