Author: jukka
Date: Tue Mar 18 17:45:19 2014
New Revision: 1578979

URL: http://svn.apache.org/r1578979
Log:
OAK-1565: Optimize repository upgrade by loading bundles where possible

... also make sure that child node ordering information is kept over the 
migration

Added:
    
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/BundleLoader.java
   (with props)
Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypePredicate.java
    
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.java
    
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java
    
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/AbstractRepositoryUpgradeTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypePredicate.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypePredicate.java?rev=1578979&r1=1578978&r2=1578979&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypePredicate.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypePredicate.java
 Tue Mar 18 17:45:19 2014
@@ -18,10 +18,13 @@ package org.apache.jackrabbit.oak.plugin
 
 import java.util.Arrays;
 import java.util.Set;
+
 import javax.annotation.Nonnull;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
+
+import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -29,6 +32,7 @@ import static com.google.common.base.Pre
 import static com.google.common.collect.Iterables.any;
 import static com.google.common.collect.Sets.newHashSet;
 import static java.util.Collections.singleton;
+import static org.apache.jackrabbit.JcrConstants.JCR_HASORDERABLECHILDNODES;
 import static org.apache.jackrabbit.JcrConstants.JCR_ISMIXIN;
 import static org.apache.jackrabbit.JcrConstants.JCR_MIXINTYPES;
 import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
@@ -44,6 +48,20 @@ import static org.apache.jackrabbit.oak.
  */
 public class TypePredicate implements Predicate<NodeState> {
 
+    public static TypePredicate isOrderable(NodeState root) {
+        Set<String> orderable = newHashSet();
+        NodeState types = checkNotNull(root)
+                .getChildNode(JCR_SYSTEM)
+                .getChildNode(JCR_NODE_TYPES);
+        for (ChildNodeEntry entry : types.getChildNodeEntries()) {
+            NodeState type = entry.getNodeState();
+            if (type.getBoolean(JCR_HASORDERABLECHILDNODES)) {
+                orderable.add(entry.getName());
+            }
+        }
+        return new TypePredicate(root, orderable);
+    }
+
     private final NodeState root;
 
     private final Iterable<String> names;
@@ -124,10 +142,7 @@ public class TypePredicate implements Pr
         }
     }
 
-    //---------------------------------------------------------< Predicate >--
-
-    @Override
-    public boolean apply(NodeState input) {
+    private void init() {
         if (!initialized) {
             // lazy initialization of the sets of matching type names
             NodeState types = checkNotNull(root)
@@ -138,7 +153,24 @@ public class TypePredicate implements Pr
             }
             initialized = true;
         }
+    }
+
+    public boolean apply(String primary, Set<String> mixins) {
+        init();
+        if (primaryTypes != null && primaryTypes.contains(primary)) {
+            return true;
+        } else if (mixinTypes != null && any(mixins, in(mixinTypes))) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    //---------------------------------------------------------< Predicate >--
 
+    @Override
+    public boolean apply(NodeState input) {
+        init();
         if (primaryTypes != null
                 && primaryTypes.contains(input.getName(JCR_PRIMARYTYPE))) {
             return true;

Added: 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/BundleLoader.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/BundleLoader.java?rev=1578979&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/BundleLoader.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/BundleLoader.java
 Tue Mar 18 17:45:19 2014
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.upgrade;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import org.apache.jackrabbit.core.id.NodeId;
+import org.apache.jackrabbit.core.id.PropertyId;
+import org.apache.jackrabbit.core.persistence.PersistenceManager;
+import 
org.apache.jackrabbit.core.persistence.bundle.AbstractBundlePersistenceManager;
+import org.apache.jackrabbit.core.persistence.util.NodePropBundle;
+import 
org.apache.jackrabbit.core.persistence.util.NodePropBundle.PropertyEntry;
+import org.apache.jackrabbit.core.state.ItemStateException;
+import org.apache.jackrabbit.core.state.NodeState;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.commons.name.NameConstants;
+
+class BundleLoader {
+
+    private final PersistenceManager pm;
+
+    private final Method loadBundle;
+
+    BundleLoader(PersistenceManager pm) {
+        this.pm = pm;
+
+        Method method = null;
+        if (pm instanceof AbstractBundlePersistenceManager) {
+            try {
+                method = AbstractBundlePersistenceManager.class
+                        .getDeclaredMethod("loadBundle", NodeId.class);
+                method.setAccessible(true);
+            } catch (SecurityException e) {
+                method = null;
+            } catch (NoSuchMethodException e) {
+                method = null;
+            }
+        }
+        this.loadBundle = method;
+    }
+
+    NodePropBundle loadBundle(NodeId id) throws ItemStateException {
+        if (loadBundle != null) {
+            try {
+                return (NodePropBundle) loadBundle.invoke(pm, id);
+            } catch (InvocationTargetException e) {
+                if (e.getCause() instanceof ItemStateException) {
+                    throw (ItemStateException) e.getCause();
+                }
+                // fall through
+            } catch (IllegalArgumentException e) {
+                // fall through
+            } catch (IllegalAccessException e) {
+                // fall through
+            }
+        }
+
+        NodeState state = pm.load(id);
+        NodePropBundle bundle = new NodePropBundle(state);
+        for (Name name : state.getPropertyNames()) {
+            if (NameConstants.JCR_PRIMARYTYPE.equals(name)) {
+            } else if (NameConstants.JCR_MIXINTYPES.equals(name)) {
+            } else if (NameConstants.JCR_UUID.equals(name)) {
+                bundle.setReferenceable(true);
+            } else {
+                bundle.addProperty(new PropertyEntry(
+                        pm.load(new PropertyId(id, name))));
+            }
+        }
+        return bundle;
+    }
+
+}

Propchange: 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/BundleLoader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.java?rev=1578979&r1=1578978&r2=1578979&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.java
 Tue Mar 18 17:45:19 2014
@@ -20,6 +20,15 @@ import static com.google.common.base.Pre
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Lists.newArrayListWithCapacity;
+import static com.google.common.collect.Maps.newHashMap;
+import static com.google.common.collect.Maps.newLinkedHashMap;
+import static com.google.common.collect.Sets.newLinkedHashSet;
+import static org.apache.jackrabbit.JcrConstants.JCR_MIXINTYPES;
+import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
+import static org.apache.jackrabbit.JcrConstants.JCR_UUID;
+import static org.apache.jackrabbit.JcrConstants.MIX_REFERENCEABLE;
+import static org.apache.jackrabbit.JcrConstants.NT_UNSTRUCTURED;
+import static 
org.apache.jackrabbit.oak.plugins.tree.TreeConstants.OAK_CHILD_ORDER;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -27,6 +36,7 @@ import java.io.InputStream;
 import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import javax.jcr.Binary;
 import javax.jcr.PropertyType;
@@ -34,22 +44,24 @@ import javax.jcr.RepositoryException;
 
 import org.apache.jackrabbit.api.ReferenceBinary;
 import org.apache.jackrabbit.core.id.NodeId;
-import org.apache.jackrabbit.core.id.PropertyId;
 import org.apache.jackrabbit.core.persistence.PersistenceManager;
-import org.apache.jackrabbit.core.state.ChildNodeEntry;
+import org.apache.jackrabbit.core.persistence.util.NodePropBundle;
+import 
org.apache.jackrabbit.core.persistence.util.NodePropBundle.ChildNodeEntry;
+import 
org.apache.jackrabbit.core.persistence.util.NodePropBundle.PropertyEntry;
 import org.apache.jackrabbit.core.state.ItemStateException;
-import org.apache.jackrabbit.core.state.NodeState;
-import org.apache.jackrabbit.core.state.PropertyState;
 import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.oak.api.Blob;
+import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.plugins.memory.AbstractBlob;
 import org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryChildNodeEntry;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeBuilder;
 import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
+import org.apache.jackrabbit.oak.plugins.nodetype.TypePredicate;
 import org.apache.jackrabbit.oak.spi.state.AbstractNodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.spi.Path;
 import org.apache.jackrabbit.util.ISO8601;
@@ -62,33 +74,48 @@ class JackrabbitNodeState extends Abstra
             LoggerFactory.getLogger(JackrabbitNodeState.class);
 
     /**
-     * Source persistence manager.
+     * Bundle loader based on the source persistence manager.
      */
-    private final PersistenceManager source;
+    private final BundleLoader loader;
+
+    private final TypePredicate isReferenceable;
+
+    private final TypePredicate isOrderable;
 
     /**
      * Source namespace mappings (URI -&lt; prefix).
      */
     private final Map<String, String> uriToPrefix;
 
-    private final NodeState state;
+    private final Map<String, NodeId> nodes;
+
+    private final Map<String, PropertyState> properties;
 
     private final boolean useBinaryReferences;
 
-    private JackrabbitNodeState(JackrabbitNodeState parent, NodeState state) {
-        this.source = parent.source;
+    private JackrabbitNodeState(
+            JackrabbitNodeState parent, NodePropBundle bundle) {
+        this.loader = parent.loader;
+        this.isReferenceable = parent.isReferenceable;
+        this.isOrderable = parent.isOrderable;
         this.uriToPrefix = parent.uriToPrefix;
-        this.state = state;
+        this.nodes = createNodes(bundle);
+        this.properties = createProperties(bundle);
         this.useBinaryReferences = parent.useBinaryReferences;
     }
 
     JackrabbitNodeState(
-            PersistenceManager source, Map<String, String> uriToPrefix,
-            NodeId id, boolean useBinaryReferences) {
-        this.source = source;
+            PersistenceManager source, NodeState root,
+            Map<String, String> uriToPrefix, NodeId id,
+            boolean useBinaryReferences) {
+        this.loader = new BundleLoader(source);
+        this.isReferenceable = new TypePredicate(root, MIX_REFERENCEABLE);
+        this.isOrderable = TypePredicate.isOrderable(root);
         this.uriToPrefix = uriToPrefix;
         try {
-            this.state = source.load(id);
+            NodePropBundle bundle = loader.loadBundle(id);
+            this.nodes = createNodes(bundle);
+            this.properties = createProperties(bundle);
         } catch (ItemStateException e) {
             throw new IllegalStateException("Unable to access node " + id, e);
         }
@@ -103,43 +130,34 @@ class JackrabbitNodeState extends Abstra
     }
 
     @Override
-    public Iterable<org.apache.jackrabbit.oak.api.PropertyState> 
getProperties() {
-        List<org.apache.jackrabbit.oak.api.PropertyState> properties = 
newArrayList();
-        for (Name name : state.getPropertyNames()) {
-            String oakName = createName(name);
-            try {
-                PropertyState property = source.load(
-                        new PropertyId(state.getNodeId(), name));
-                int type = property.getType();
-                if (property.isMultiValued()) {
-                    properties.add(createProperty(
-                            oakName, type, property.getValues()));
-                } else {
-                    properties.add(createProperty(
-                            oakName, type, property.getValues()[0]));
-                }
-            } catch (Exception e) {
-                warn("Unable to access property " + oakName, e);
-            }
-        }
-        return properties;
+    public boolean hasProperty(String name) {
+        return properties.containsKey(name);
+    }
+
+    @Override
+    public PropertyState getProperty(String name) {
+        return properties.get(name);
+    }
+
+    @Override
+    public Iterable<PropertyState> getProperties() {
+        return properties.values();
     }
 
     @Override
     public boolean hasChildNode(String name) {
-        for (MemoryChildNodeEntry entry : getChildNodeEntries()) {
-            if (name.equals(entry.getName())) {
-                return true;
-            }
-        }
-        return false;
+        return nodes.containsKey(name);
     }
 
     @Override
-    public org.apache.jackrabbit.oak.spi.state.NodeState getChildNode(String 
name) {
-        for (MemoryChildNodeEntry entry : getChildNodeEntries()) {
-            if (name.equals(entry.getName())) {
-                return entry.getNodeState();
+    public NodeState getChildNode(String name) {
+        NodeId id = nodes.get(name);
+        if (id != null) {
+            try {
+                return new JackrabbitNodeState(this, loader.loadBundle(id));
+            } catch (ItemStateException e) {
+                throw new IllegalStateException(
+                        "Unable to access child node " + name, e);
             }
         }
         checkValidName(name);
@@ -149,20 +167,14 @@ class JackrabbitNodeState extends Abstra
     @Override
     public Iterable<MemoryChildNodeEntry> getChildNodeEntries() {
         List<MemoryChildNodeEntry> entries = newArrayList();
-        for (ChildNodeEntry entry : state.getChildNodeEntries()) {
-            String name = createName(entry.getName());
-            int index = entry.getIndex();
-            if (index > 1) {
-                name = name + '[' + index + ']';
-            }
-
+        for (Map.Entry<String, NodeId> entry : nodes.entrySet()) {
+            String name = entry.getKey();
             try {
-                NodeState childState = source.load(entry.getId());
-                JackrabbitNodeState child =
-                        new JackrabbitNodeState(this, childState);
+                JackrabbitNodeState child = new JackrabbitNodeState(
+                        this, loader.loadBundle(entry.getValue()));
                 entries.add(new MemoryChildNodeEntry(name, child));
             } catch (ItemStateException e) {
-                warn("Unable to access child entry " + name, e);
+                warn("Skipping broken child node entry " + name, e);
             }
         }
         return entries;
@@ -175,6 +187,73 @@ class JackrabbitNodeState extends Abstra
 
     //-----------------------------------------------------------< private >--
 
+    private Map<String, NodeId> createNodes(NodePropBundle bundle) {
+        Map<String, NodeId> children = newLinkedHashMap();
+        for (ChildNodeEntry entry : bundle.getChildNodeEntries()) {
+            String base = createName(entry.getName());
+            String name = base;
+            for (int i = 2; children.containsKey(name); i++) {
+                name = base + '[' + i + ']';
+            }
+            children.put(name, entry.getId());
+        }
+        return children;
+    }
+
+    public Map<String, PropertyState> createProperties(NodePropBundle bundle) {
+        Map<String, PropertyState> properties = newHashMap();
+
+        String primary;
+        if (bundle.getNodeTypeName() != null) {
+            primary = createName(bundle.getNodeTypeName());
+        } else {
+            warn("Missing primary node type; defaulting to nt:unstructured");
+            primary = NT_UNSTRUCTURED;
+        }
+        properties.put(JCR_PRIMARYTYPE, PropertyStates.createProperty(
+                JCR_PRIMARYTYPE, primary, Type.NAME));
+
+        Set<String> mixins = newLinkedHashSet();
+        if (bundle.getMixinTypeNames() != null) {
+            for (Name mixin : bundle.getMixinTypeNames()) {
+                mixins.add(createName(mixin));
+            }
+        }
+        if (!mixins.isEmpty()) {
+            properties.put(JCR_MIXINTYPES, PropertyStates.createProperty(
+                    JCR_MIXINTYPES, mixins, Type.NAMES));
+        }
+
+        if (bundle.isReferenceable()
+                || isReferenceable.apply(primary, mixins)) {
+            properties.put(JCR_UUID, PropertyStates.createProperty(
+                    JCR_UUID, bundle.getId().toString()));
+        }
+
+        if (isOrderable.apply(primary, mixins)) {
+            properties.put(OAK_CHILD_ORDER, PropertyStates.createProperty(
+                    OAK_CHILD_ORDER, nodes.keySet(), Type.NAMES));
+        }
+
+        for (PropertyEntry property : bundle.getPropertyEntries()) {
+            String name = createName(property.getName());
+            try {
+                int type = property.getType();
+                if (property.isMultiValued()) {
+                    properties.put(name, createProperty(
+                            name, type, property.getValues()));
+                } else {
+                    properties.put(name, createProperty(
+                            name, type, property.getValues()[0]));
+                }
+            } catch (Exception e) {
+                warn("Skipping broken property entry " + name, e);
+            }
+        }
+
+        return properties;
+    }
+
     private org.apache.jackrabbit.oak.api.PropertyState createProperty(
             String name, int type, InternalValue value)
             throws RepositoryException, IOException {

Modified: 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java?rev=1578979&r1=1578978&r2=1578979&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java
 Tue Mar 18 17:45:19 2014
@@ -219,8 +219,10 @@ public class RepositoryUpgrade {
             copyNamespaces(builder, uriToPrefix, idxToPrefix);
             copyNodeTypes(builder);
             copyPrivileges(builder);
-            copyVersionStore(builder, uriToPrefix, idxToPrefix);
-            copyWorkspaces(builder, uriToPrefix, idxToPrefix);
+
+            NodeState root = builder.getNodeState();
+            copyVersionStore(builder, root, uriToPrefix, idxToPrefix);
+            copyWorkspaces(builder, root, uriToPrefix, idxToPrefix);
 
             String groupsPath;
             UserManagerConfig userConfig = 
config.getSecurityConfig().getSecurityManagerConfig().getUserManagerConfig();
@@ -537,7 +539,7 @@ public class RepositoryUpgrade {
     }
 
     private void copyVersionStore(
-            NodeBuilder root,
+            NodeBuilder builder, NodeState root,
             Map<String, String> uriToPrefix, Map<Integer, String> idxToPrefix)
             throws RepositoryException, IOException {
         logger.info("Copying version histories");
@@ -545,15 +547,17 @@ public class RepositoryUpgrade {
         PersistenceManager pm =
                 source.getInternalVersionManager().getPersistenceManager();
 
-        NodeBuilder system = root.child(JCR_SYSTEM);
+        NodeBuilder system = builder.child(JCR_SYSTEM);
         system.setChildNode(JCR_VERSIONSTORAGE, new JackrabbitNodeState(
-                pm, uriToPrefix, VERSION_STORAGE_NODE_ID, 
copyBinariesByReference));
+                pm, root, uriToPrefix,
+                VERSION_STORAGE_NODE_ID, copyBinariesByReference));
         system.setChildNode("jcr:activities", new JackrabbitNodeState(
-                pm, uriToPrefix, ACTIVITIES_NODE_ID, copyBinariesByReference));
+                pm, root, uriToPrefix,
+                ACTIVITIES_NODE_ID, copyBinariesByReference));
     }   
 
     private void copyWorkspaces(
-            NodeBuilder root,
+            NodeBuilder builder, NodeState root,
             Map<String, String> uriToPrefix, Map<Integer, String> idxToPrefix)
             throws RepositoryException, IOException {
         logger.info("Copying default workspace");
@@ -566,14 +570,14 @@ public class RepositoryUpgrade {
                 source.getWorkspaceInfo(name).getPersistenceManager();
 
         NodeState state = new JackrabbitNodeState(
-                pm, uriToPrefix, ROOT_NODE_ID, copyBinariesByReference);
+                pm, root, uriToPrefix, ROOT_NODE_ID, copyBinariesByReference);
         for (PropertyState property : state.getProperties()) {
-            root.setProperty(property);
+            builder.setProperty(property);
         }
         for (ChildNodeEntry child : state.getChildNodeEntries()) {
             String childName = child.getName();
             if (!JCR_SYSTEM.equals(childName)) {
-                root.setChildNode(childName, child.getNodeState());
+                builder.setChildNode(childName, child.getNodeState());
             }
         }
 

Modified: 
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/AbstractRepositoryUpgradeTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/AbstractRepositoryUpgradeTest.java?rev=1578979&r1=1578978&r2=1578979&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/AbstractRepositoryUpgradeTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/AbstractRepositoryUpgradeTest.java
 Tue Mar 18 17:45:19 2014
@@ -38,6 +38,7 @@ import org.apache.jackrabbit.oak.Oak;
 import org.apache.jackrabbit.oak.jcr.Jcr;
 import org.apache.jackrabbit.oak.kernel.KernelNodeStore;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.apache.jackrabbit.oak.stats.Clock;
 import org.junit.Before;
 import org.junit.BeforeClass;
 
@@ -56,7 +57,8 @@ public abstract class AbstractRepository
     @Before
     public synchronized void upgradeRepository() throws Exception {
         if (targetRepository == null) {
-            File directory = new File("target", "upgrade");
+            File directory = new File(
+                    "target", "upgrade-" + Clock.SIMPLE.getTimeIncreasing());
             FileUtils.deleteQuietly(directory);
 
             File source = new File(directory, "source");


Reply via email to