Author: jukka
Date: Thu Mar 20 14:25:31 2014
New Revision: 1579637
URL: http://svn.apache.org/r1579637
Log:
OAK-1584: Performance regression of adding and removinf child nodes after
OAK-850
Don't scan the full list of child nodes whenever adding or removing children
(to an orderable node)
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java?rev=1579637&r1=1579636&r2=1579637&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java
Thu Mar 20 14:25:31 2014
@@ -22,6 +22,7 @@ import static com.google.common.base.Pre
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.collect.Lists.newArrayList;
+import static com.google.common.collect.Sets.newLinkedHashSet;
import static org.apache.jackrabbit.oak.api.Type.NAMES;
import static org.apache.jackrabbit.oak.commons.PathUtils.elements;
import static org.apache.jackrabbit.oak.commons.PathUtils.isAbsolute;
@@ -29,6 +30,7 @@ import static org.apache.jackrabbit.oak.
import static org.apache.jackrabbit.oak.spi.state.NodeStateUtils.isHidden;
import java.util.List;
+import java.util.Set;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
@@ -173,7 +175,12 @@ class MutableTree extends AbstractTree {
beforeWrite();
if (parent != null && parent.hasChild(name)) {
nodeBuilder.remove();
- updateChildOrder(false);
+ PropertyState order =
parent.nodeBuilder.getProperty(OAK_CHILD_ORDER);
+ if (order != null) {
+ Set<String> names = newLinkedHashSet(order.getValue(NAMES));
+ names.remove(name);
+ parent.nodeBuilder.setProperty(OAK_CHILD_ORDER, names, NAMES);
+ }
root.updated();
return true;
} else {
@@ -187,7 +194,12 @@ class MutableTree extends AbstractTree {
beforeWrite();
if (!super.hasChild(name)) {
nodeBuilder.setChildNode(name);
- updateChildOrder(false);
+ PropertyState order = nodeBuilder.getProperty(OAK_CHILD_ORDER);
+ if (order != null) {
+ Set<String> names = newLinkedHashSet(order.getValue(NAMES));
+ names.add(name);
+ nodeBuilder.setProperty(OAK_CHILD_ORDER, names, NAMES);
+ }
root.updated();
}
return createChild(name);