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