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/06/02 17:23:01 UTC
svn commit: r1599239 - in /jackrabbit/oak/branches/1.0: ./
oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/
oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/
Author: jukka
Date: Mon Jun 2 15:23:01 2014
New Revision: 1599239
URL: http://svn.apache.org/r1599239
Log:
1.0.1: Merged revision 1598797 (OAK-1866)
Added:
jackrabbit/oak/branches/1.0/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/FlatTreeUpdateTest.java
- copied unchanged from r1598797, jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/FlatTreeUpdateTest.java
Modified:
jackrabbit/oak/branches/1.0/ (props changed)
jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapRecord.java
jackrabbit/oak/branches/1.0/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
Propchange: jackrabbit/oak/branches/1.0/
------------------------------------------------------------------------------
Merged /jackrabbit/oak/trunk:r1598797
Modified: jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapRecord.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapRecord.java?rev=1599239&r1=1599238&r2=1599239&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapRecord.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapRecord.java Mon Jun 2 15:23:01 2014
@@ -28,6 +28,8 @@ import java.util.Collections;
import java.util.Iterator;
import java.util.List;
+import org.apache.jackrabbit.oak.spi.state.DefaultNodeStateDiff;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
import org.apache.jackrabbit.oak.spi.state.NodeStateDiff;
import com.google.common.base.Objects;
@@ -310,7 +312,7 @@ class MapRecord extends Record {
}
private Iterable<MapEntry> getEntries(
- RecordId diffKey, RecordId diffValue) {
+ final RecordId diffKey, final RecordId diffValue) {
Segment segment = getSegment();
int head = segment.readInt(getOffset(0));
@@ -331,8 +333,13 @@ class MapRecord extends Record {
List<MapRecord> buckets = getBucketList(segment);
List<Iterable<MapEntry>> entries =
newArrayListWithCapacity(buckets.size());
- for (MapRecord bucket : buckets) {
- entries.add(bucket.getEntries(diffKey, diffValue));
+ for (final MapRecord bucket : buckets) {
+ entries.add(new Iterable<MapEntry>() {
+ @Override
+ public Iterator<MapEntry> iterator() {
+ return bucket.getEntries(diffKey, diffValue).iterator();
+ }
+ });
}
return concat(entries);
}
@@ -356,65 +363,101 @@ class MapRecord extends Record {
return Arrays.asList(entries);
}
- boolean compare(MapRecord before, NodeStateDiff diff) {
+ boolean compare(MapRecord before, final NodeStateDiff diff) {
+ if (fastEquals(this, before)) {
+ return true;
+ }
+
+ Segment segment = getSegment();
+ int head = segment.readInt(getOffset(0));
+ if (isDiff(head)) {
+ int hash = segment.readInt(getOffset(4));
+ RecordId keyId = segment.readRecordId(getOffset(8));
+ final String key = segment.readString(keyId);
+ final RecordId value = segment.readRecordId(getOffset(8, 1));
+ MapRecord base = new MapRecord(segment.readRecordId(getOffset(8, 2)));
+
+ boolean rv = base.compare(before, new DefaultNodeStateDiff() {
+ @Override
+ public boolean childNodeAdded(String name, NodeState after) {
+ return name.equals(key)
+ || diff.childNodeAdded(name, after);
+ }
+ @Override
+ public boolean childNodeChanged(
+ String name, NodeState before, NodeState after) {
+ return name.equals(key)
+ || diff.childNodeChanged(name, before, after);
+ }
+ @Override
+ public boolean childNodeDeleted(String name, NodeState before) {
+ return diff.childNodeDeleted(name, before);
+ }
+ });
+ if (rv) {
+ MapEntry beforeEntry = before.getEntry(key);
+ if (beforeEntry == null) {
+ rv = diff.childNodeAdded(
+ key,
+ new SegmentNodeState(value));
+ } else if (!value.equals(beforeEntry.getValue())) {
+ rv = diff.childNodeChanged(
+ key,
+ beforeEntry.getNodeState(),
+ new SegmentNodeState(value));
+ }
+ }
+ return rv;
+ }
+
Segment beforeSegment = before.getSegment();
int beforeHead = beforeSegment.readInt(before.getOffset(0));
-
- MapRecord after = this;
- Segment afterSegment = after.getSegment();
- int afterHead = afterSegment.readInt(after.getOffset(0));
-
- if (isDiff(afterHead)) {
- RecordId base = afterSegment.readRecordId(after.getOffset(8, 2));
- if (base.equals(after.getRecordId())) {
- int hash = afterSegment.readInt(after.getOffset(4));
- RecordId key = afterSegment.readRecordId(after.getOffset(8));
- RecordId afterValue = afterSegment.readRecordId(after.getOffset(8, 1));
- RecordId beforeValue = before.getValue(hash, key);
- String name = beforeSegment.readString(key);
- return diff.childNodeChanged(
- name,
- new SegmentNodeState(beforeValue),
- new SegmentNodeState(afterValue));
- } else if (isDiff(beforeHead)) {
- RecordId beforeBase =
- beforeSegment.readRecordId(before.getOffset(8, 2));
- if (base.equals(beforeBase)) {
- int beforeHash = beforeSegment.readInt(before.getOffset(4));
- RecordId beforeKey = beforeSegment.readRecordId(before.getOffset(8));
- RecordId beforeValue = beforeSegment.readRecordId(before.getOffset(8, 1));
-
- int afterHash = afterSegment.readInt(after.getOffset(4));
- RecordId afterKey = afterSegment.readRecordId(after.getOffset(8));
- RecordId afterValue = afterSegment.readRecordId(after.getOffset(8, 1));
-
- if (beforeKey.equals(afterKey)) {
- String name = beforeSegment.readString(beforeKey);
- return diff.childNodeChanged(
- name,
- new SegmentNodeState(beforeValue),
- new SegmentNodeState(afterValue));
- } else {
- String beforeName = beforeSegment.readString(beforeKey);
- String afterName = afterSegment.readString(afterKey);
- return diff.childNodeChanged(
- beforeName,
- new SegmentNodeState(beforeValue),
- new SegmentNodeState(after.getValue(beforeHash, beforeKey)))
- &&
- diff.childNodeChanged(
- afterName,
- new SegmentNodeState(before.getValue(afterHash, afterKey)),
- new SegmentNodeState(afterValue));
- }
+ if (isDiff(beforeHead)) {
+ int hash = beforeSegment.readInt(before.getOffset(4));
+ RecordId keyId = beforeSegment.readRecordId(before.getOffset(8));
+ final String key = beforeSegment.readString(keyId);
+ final RecordId value = beforeSegment.readRecordId(before.getOffset(8, 1));
+ MapRecord base = new MapRecord(beforeSegment.readRecordId(before.getOffset(8, 2)));
+
+ boolean rv = this.compare(base, new DefaultNodeStateDiff() {
+ @Override
+ public boolean childNodeAdded(String name, NodeState after) {
+ return diff.childNodeAdded(name, after);
+ }
+ @Override
+ public boolean childNodeChanged(
+ String name, NodeState before, NodeState after) {
+ return name.equals(key)
+ || diff.childNodeChanged(name, before, after);
+ }
+ @Override
+ public boolean childNodeDeleted(String name, NodeState before) {
+ return name.equals(key)
+ || diff.childNodeDeleted(name, before);
+ }
+ });
+ if (rv) {
+ MapEntry afterEntry = this.getEntry(key);
+ if (afterEntry == null) {
+ rv = diff.childNodeDeleted(
+ key,
+ new SegmentNodeState(value));
+ } else if (!value.equals(afterEntry.getValue())) {
+ rv = diff.childNodeChanged(
+ key,
+ new SegmentNodeState(value),
+ afterEntry.getNodeState());
}
}
- } else if (isBranch(beforeHead) && isBranch(afterHead)) {
- return compareBranch(before, after, diff);
+ return rv;
+ }
+
+ if (isBranch(beforeHead) && isBranch(head)) {
+ return compareBranch(before, this, diff);
}
Iterator<MapEntry> beforeEntries = before.getEntries().iterator();
- Iterator<MapEntry> afterEntries = after.getEntries().iterator();
+ Iterator<MapEntry> afterEntries = this.getEntries().iterator();
MapEntry beforeEntry = nextOrNull(beforeEntries);
MapEntry afterEntry = nextOrNull(afterEntries);
Modified: jackrabbit/oak/branches/1.0/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java?rev=1599239&r1=1599238&r2=1599239&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java (original)
+++ jackrabbit/oak/branches/1.0/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java Mon Jun 2 15:23:01 2014
@@ -127,6 +127,7 @@ public class BenchmarkRunner {
new SQL2SearchTest(),
new DescendantSearchTest(),
new SQL2DescendantSearchTest(),
+ new FlatTreeUpdateTest(),
new CreateManyChildNodesTest(),
new CreateManyNodesTest(),
new UpdateManyChildNodesTest(),