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));