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 to...@apache.org on 2016/07/15 10:34:22 UTC

svn commit: r1752815 - in /jackrabbit/oak/trunk/oak-upgrade/src: main/java/org/apache/jackrabbit/core/ main/java/org/apache/jackrabbit/oak/upgrade/ main/java/org/apache/jackrabbit/oak/upgrade/cli/ main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/...

Author: tomekr
Date: Fri Jul 15 10:34:21 2016
New Revision: 1752815

URL: http://svn.apache.org/viewvc?rev=1752815&view=rev
Log:
OAK-4564: Use Lucene index to look for long-named nodes in JCR2 upgrade

Added:
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/core/
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/core/IndexAccessor.java
Modified:
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/MigrationFactory.java
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/MigrationOptions.java
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/OptionParserFactory.java
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreArguments.java
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreType.java
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java
    jackrabbit/oak/trunk/oak-upgrade/src/main/resources/upgrade_usage.txt
    jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/LongNameTest.java

Added: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/core/IndexAccessor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/core/IndexAccessor.java?rev=1752815&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/core/IndexAccessor.java (added)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/core/IndexAccessor.java Fri Jul 15 10:34:21 2016
@@ -0,0 +1,39 @@
+/*
+ * 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.core;
+
+import org.apache.jackrabbit.core.query.QueryHandler;
+import org.apache.jackrabbit.core.query.lucene.SearchIndex;
+import org.apache.lucene.index.IndexReader;
+
+import javax.jcr.RepositoryException;
+import java.io.IOException;
+
+public final class IndexAccessor {
+
+    private IndexAccessor() {
+    }
+
+    public static IndexReader getReader(RepositoryContext ctx) throws RepositoryException, IOException {
+        RepositoryImpl repo = ctx.getRepository();
+        SearchManager searchMgr = repo.getSearchManager(ctx.getRepositoryConfig().getDefaultWorkspaceName());
+        QueryHandler handler = searchMgr.getQueryHandler();
+        SearchIndex index = (SearchIndex) handler;
+        return index.getIndexReader();
+    }
+
+}

Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java?rev=1752815&r1=1752814&r2=1752815&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java Fri Jul 15 10:34:21 2016
@@ -91,7 +91,7 @@ public class RepositorySidegrade {
      */
     private Set<String> mergePaths = DEFAULT_MERGE_PATHS;
 
-    private boolean skipLongNames = true;
+    private boolean filterLongNames = true;
 
     private boolean skipInitialization = false;
 
@@ -198,12 +198,12 @@ public class RepositorySidegrade {
         this.mergePaths = copyOf(checkNotNull(merges));
     }
 
-    public boolean isSkipLongNames() {
-        return skipLongNames;
+    public boolean isFilterLongNames() {
+        return filterLongNames;
     }
 
-    public void setSkipLongNames(boolean skipLongNames) {
-        this.skipLongNames = skipLongNames;
+    public void setFilterLongNames(boolean filterLongNames) {
+        this.filterLongNames = filterLongNames;
     }
 
     /**
@@ -252,7 +252,7 @@ public class RepositorySidegrade {
 
             final NodeState reportingSourceRoot = ReportingNodeState.wrap(source.getRoot(), new LoggingReporter(LOG, "Copying", 10000, -1));
             final NodeState sourceRoot;
-            if (skipLongNames) {
+            if (filterLongNames) {
                 sourceRoot = NameFilteringNodeState.wrap(reportingSourceRoot);
             } else {
                 sourceRoot = reportingSourceRoot;

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=1752815&r1=1752814&r2=1752815&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 Fri Jul 15 10:34:21 2016
@@ -30,6 +30,7 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.plugins.name.Namespaces.addCustomMapping;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.NODE_TYPES_PATH;
 import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_ALL;
+import static org.apache.jackrabbit.oak.upgrade.cli.parser.OptionParserFactory.SKIP_NAME_CHECK;
 import static org.apache.jackrabbit.oak.upgrade.nodestate.FilteringNodeState.ALL;
 import static org.apache.jackrabbit.oak.upgrade.nodestate.FilteringNodeState.NONE;
 import static org.apache.jackrabbit.oak.upgrade.nodestate.NodeStateCopier.copyProperties;
@@ -49,7 +50,9 @@ import java.util.concurrent.TimeUnit;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.jcr.NamespaceException;
+import javax.jcr.Node;
 import javax.jcr.RepositoryException;
+import javax.jcr.Session;
 import javax.jcr.Value;
 import javax.jcr.ValueFactory;
 import javax.jcr.nodetype.NodeDefinitionTemplate;
@@ -66,6 +69,7 @@ import com.google.common.collect.Immutab
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import org.apache.jackrabbit.api.security.authorization.PrivilegeManager;
+import org.apache.jackrabbit.core.IndexAccessor;
 import org.apache.jackrabbit.core.RepositoryContext;
 import org.apache.jackrabbit.core.config.BeanConfig;
 import org.apache.jackrabbit.core.config.LoginModuleConfig;
@@ -74,6 +78,7 @@ import org.apache.jackrabbit.core.config
 import org.apache.jackrabbit.core.fs.FileSystem;
 import org.apache.jackrabbit.core.fs.FileSystemException;
 import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
+import org.apache.jackrabbit.core.query.lucene.FieldNames;
 import org.apache.jackrabbit.core.security.authorization.PrivilegeRegistry;
 import org.apache.jackrabbit.core.security.user.UserManagerImpl;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
@@ -87,7 +92,6 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.index.IndexUpdate;
 import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
 import org.apache.jackrabbit.oak.plugins.index.IndexUtils;
-import org.apache.jackrabbit.oak.plugins.index.counter.NodeCounterEditorProvider;
 import org.apache.jackrabbit.oak.plugins.index.property.PropertyIndexEditorProvider;
 import org.apache.jackrabbit.oak.plugins.index.reference.ReferenceEditorProvider;
 import org.apache.jackrabbit.oak.plugins.name.NamespaceConstants;
@@ -133,6 +137,10 @@ import org.apache.jackrabbit.spi.QValueC
 import org.apache.jackrabbit.spi.commons.conversion.DefaultNamePathResolver;
 import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
 import org.apache.jackrabbit.spi.commons.value.ValueFormat;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.index.TermDocs;
+import org.apache.lucene.index.TermEnum;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -186,7 +194,9 @@ public class RepositoryUpgrade {
 
     private List<CommitHook> customCommitHooks = null;
 
-    private boolean skipLongNames = true;
+    private boolean checkLongNames = false;
+
+    private boolean filterLongNames = true;
 
     private boolean skipInitialization = false;
 
@@ -260,12 +270,20 @@ public class RepositoryUpgrade {
         this.earlyShutdown = earlyShutdown;
     }
 
-    public boolean isSkipLongNames() {
-        return skipLongNames;
+    public boolean isCheckLongNames() {
+        return checkLongNames;
+    }
+
+    public void setCheckLongNames(boolean checkLongNames) {
+        this.checkLongNames = checkLongNames;
+    }
+
+    public boolean isFilterLongNames() {
+        return filterLongNames;
     }
 
-    public void setSkipLongNames(boolean skipLongNames) {
-        this.skipLongNames = skipLongNames;
+    public void setFilterLongNames(boolean filterLongNames) {
+        this.filterLongNames = filterLongNames;
     }
 
     public boolean isSkipInitialization() {
@@ -316,7 +334,6 @@ public class RepositoryUpgrade {
         this.excludePaths = copyOf(checkNotNull(excludes));
     }
 
-
     /**
      * Sets the paths that should be merged when the source repository
      * is copied to the target repository.
@@ -376,6 +393,10 @@ public class RepositoryUpgrade {
      * @throws RepositoryException if the copy operation fails
      */
     public void copy(RepositoryInitializer initializer) throws RepositoryException {
+        if (checkLongNames) {
+            assertNoLongNames();
+        }
+
         RepositoryConfig config = source.getRepositoryConfig();
         logger.info("Copying repository content from {} to Oak", config.getHomeDir());
         try {
@@ -454,7 +475,7 @@ public class RepositoryUpgrade {
                     new LoggingReporter(logger, "Migrating", 10000, -1)
             );
             final NodeState sourceRoot;
-            if (skipLongNames) {
+            if (filterLongNames) {
                 sourceRoot = NameFilteringNodeState.wrap(reportingSourceRoot);
             } else {
                 sourceRoot = reportingSourceRoot;
@@ -939,6 +960,40 @@ public class RepositoryUpgrade {
         return includes;
     }
 
+    void assertNoLongNames() throws RepositoryException {
+        Session session = source.getRepository().login(null, null);
+        boolean longNameFound = false;
+        try {
+            IndexReader reader = IndexAccessor.getReader(source);
+            TermEnum terms = reader.terms(new Term(FieldNames.LOCAL_NAME));
+            while (terms.next()) {
+                Term t = terms.term();
+                if (!FieldNames.LOCAL_NAME.equals(t.field())) {
+                    continue;
+                }
+                String name = t.text();
+                if (NameFilteringNodeState.isNameTooLong(name)) {
+                    TermDocs docs = reader.termDocs(t);
+                    if (docs.next()) {
+                        int docId = docs.doc();
+                        String uuid = reader.document(docId).get(FieldNames.UUID);
+                        Node n = session.getNodeByIdentifier(uuid);
+                        logger.warn("Name too long: {}", n.getPath());
+                        longNameFound = true;
+                    }
+                }
+            }
+        } catch (IOException e) {
+            throw new RepositoryException(e);
+        } finally {
+            session.logout();
+        }
+        if (longNameFound) {
+            logger.error("Node with a long name has been found. Please fix the content or rerun the migration with {} option.", SKIP_NAME_CHECK);
+            throw new RepositoryException("Node with a long name has been found.");
+        }
+    }
+
     static class LoggingCompositeHook implements CommitHook {
         private final Collection<CommitHook> hooks;
         private boolean started = false;

Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/MigrationFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/MigrationFactory.java?rev=1752815&r1=1752814&r2=1752815&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/MigrationFactory.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/MigrationFactory.java Fri Jul 15 10:34:21 2016
@@ -90,7 +90,8 @@ public class MigrationFactory {
         if (options.getMergePaths() != null) {
             upgrade.setMerges(options.getMergePaths());
         }
-        upgrade.setSkipLongNames(stores.isSkipLongNames());
+        upgrade.setFilterLongNames(!stores.getDstType().isSupportLongNames());
+        upgrade.setCheckLongNames(!options.isSkipNameCheck() && !stores.getDstType().isSupportLongNames());
         upgrade.setSkipOnError(!options.isFailOnError());
         upgrade.setEarlyShutdown(options.isEarlyShutdown());
         upgrade.setSkipInitialization(options.isSkipInitialization());
@@ -114,7 +115,7 @@ public class MigrationFactory {
         if (options.getMergePaths() != null) {
             sidegrade.setMerges(options.getMergePaths());
         }
-        sidegrade.setSkipLongNames(stores.isSkipLongNames());
+        sidegrade.setFilterLongNames(stores.getSrcType().isSupportLongNames() && !stores.getDstType().isSupportLongNames());
         sidegrade.setSkipInitialization(options.isSkipInitialization());
         return sidegrade;
     }

Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/MigrationOptions.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/MigrationOptions.java?rev=1752815&r1=1752814&r2=1752815&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/MigrationOptions.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/MigrationOptions.java Fri Jul 15 10:34:21 2016
@@ -52,6 +52,8 @@ public class MigrationOptions {
 
     private final boolean skipInitialization;
 
+    private final boolean skipNameCheck;
+
     public MigrationOptions(MigrationCliArguments args) {
         this.copyBinariesByReference = !args.hasOption(OptionParserFactory.COPY_BINARIES);
         this.mmap = args.hasOption(OptionParserFactory.MMAP);
@@ -79,6 +81,7 @@ public class MigrationOptions {
         this.failOnError = args.hasOption(OptionParserFactory.FAIL_ON_ERROR);
         this.earlyShutdown = args.hasOption(OptionParserFactory.EARLY_SHUTDOWN);
         this.skipInitialization = args.hasOption(OptionParserFactory.SKIP_INIT);
+        this.skipNameCheck = args.hasOption(OptionParserFactory.SKIP_NAME_CHECK);
         logOptions();
     }
 
@@ -126,6 +129,10 @@ public class MigrationOptions {
         return skipInitialization;
     }
 
+    public boolean isSkipNameCheck() {
+        return skipNameCheck;
+    }
+
     private void logOptions() {
         if (copyBinariesByReference) {
             log.info("DataStore needs to be shared with new repository");
@@ -169,6 +176,10 @@ public class MigrationOptions {
             log.info("The repository initialization will be skipped");
         }
 
+        if (skipNameCheck) {
+            log.info("Test for long-named nodes will be disabled");
+        }
+
         log.info("Cache size: {} MB", cacheSizeInMB);
 
     }

Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/OptionParserFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/OptionParserFactory.java?rev=1752815&r1=1752814&r2=1752815&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/OptionParserFactory.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/OptionParserFactory.java Fri Jul 15 10:34:21 2016
@@ -72,6 +72,8 @@ public class OptionParserFactory {
 
     public static final String SKIP_INIT = "skip-init";
 
+    public static final String SKIP_NAME_CHECK = "skip-name-check";
+
     public static OptionParser create() {
         OptionParser op = new OptionParser();
         addUsageOptions(op);

Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreArguments.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreArguments.java?rev=1752815&r1=1752814&r2=1752815&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreArguments.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreArguments.java Fri Jul 15 10:34:21 2016
@@ -96,6 +96,14 @@ public class StoreArguments {
         return dst.getFactory(MigrationDirection.DST, parser);
     }
 
+    public StoreType getSrcType() {
+        return src.getType();
+    }
+
+    public StoreType getDstType() {
+        return dst.getType();
+    }
+
     public BlobStoreFactory getSrcBlobStore() throws IOException {
         BlobStoreFactory factory;
         if (parser.hasOption(SRC_FBS)) {
@@ -137,10 +145,6 @@ public class StoreArguments {
         return false;
     }
 
-    public boolean isSkipLongNames() {
-        return dst.getType() != SEGMENT && dst.getType() != SEGMENT_TAR;
-    }
-
     public String[] getSrcPaths() {
         return src.getPaths();
     }

Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreType.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreType.java?rev=1752815&r1=1752814&r2=1752815&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreType.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreType.java Fri Jul 15 10:34:21 2016
@@ -29,7 +29,7 @@ import org.apache.jackrabbit.oak.upgrade
 import org.apache.jackrabbit.oak.upgrade.cli.node.StoreFactory;
 import org.apache.jackrabbit.oak.upgrade.cli.parser.StoreArguments.MigrationDirection;
 
-enum StoreType {
+public enum StoreType {
     JCR2_XML {
         @Override
         public boolean matches(String argument) {
@@ -40,6 +40,11 @@ enum StoreType {
         public StoreFactory createFactory(String[] paths, MigrationDirection direction, MigrationCliArguments arguments) {
             throw new UnsupportedOperationException();
         }
+
+        @Override
+        public boolean isSupportLongNames() {
+            return true;
+        }
     },
     JCR2_DIR {
         @Override
@@ -51,6 +56,11 @@ enum StoreType {
         public StoreFactory createFactory(String[] paths, MigrationDirection direction, MigrationCliArguments arguments) {
             throw new UnsupportedOperationException();
         }
+
+        @Override
+        public boolean isSupportLongNames() {
+            return true;
+        }
     },
     JCR2_DIR_XML {
         @Override
@@ -62,6 +72,11 @@ enum StoreType {
         public StoreFactory createFactory(String[] paths, MigrationDirection direction, MigrationCliArguments arguments) {
             return new StoreFactory(new Jackrabbit2Factory(paths[0], paths[1]));
         }
+
+        @Override
+        public boolean isSupportLongNames() {
+            return true;
+        }
     },
     JDBC {
         @Override
@@ -82,6 +97,11 @@ enum StoreType {
             return new StoreFactory(
                     new JdbcFactory(paths[0], arguments.getOptions().getCacheSizeInMB(), username, password));
         }
+
+        @Override
+        public boolean isSupportLongNames() {
+            return false;
+        }
     },
     MONGO {
         @Override
@@ -93,6 +113,11 @@ enum StoreType {
         public StoreFactory createFactory(String[] paths, MigrationDirection direction, MigrationCliArguments arguments) {
             return new StoreFactory(new MongoFactory(paths[0], arguments.getOptions().getCacheSizeInMB()));
         }
+
+        @Override
+        public boolean isSupportLongNames() {
+            return false;
+        }
     },
     SEGMENT {
         @Override
@@ -105,6 +130,11 @@ enum StoreType {
             String path = removeStart(paths[0], SEGMENT_OLD_PREFIX);
             return new StoreFactory(new SegmentFactory(path, arguments.getOptions().isMmap()));
         }
+
+        @Override
+        public boolean isSupportLongNames() {
+            return true;
+        }
     },
     SEGMENT_TAR {
         @Override
@@ -116,6 +146,11 @@ enum StoreType {
         public StoreFactory createFactory(String[] paths, MigrationDirection direction, MigrationCliArguments arguments) {
             return new StoreFactory(new SegmentTarFactory(paths[0], arguments.getOptions().isMmap()));
         }
+
+        @Override
+        public boolean isSupportLongNames() {
+            return true;
+        }
     };
 
     public static StoreType getMatchingType(String argument) {
@@ -131,6 +166,8 @@ enum StoreType {
 
     public abstract StoreFactory createFactory(String[] paths, MigrationDirection direction, MigrationCliArguments arguments);
 
+    public abstract boolean isSupportLongNames();
+
     public boolean isSegment() {
         return this == SEGMENT || this == SEGMENT_TAR;
     }

Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java?rev=1752815&r1=1752814&r2=1752815&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java Fri Jul 15 10:34:21 2016
@@ -72,7 +72,7 @@ public class NameFilteringNodeState exte
      *            to check
      * @return true if the name is longer than {@link Utils#NODE_NAME_LIMIT}
      */
-    private static boolean isNameTooLong(@Nonnull String name) {
+    public static boolean isNameTooLong(@Nonnull String name) {
         // OAK-1589: maximum supported length of name for DocumentNodeStore
         // is 150 bytes. Skip the sub tree if the the name is too long
         return name.length() > SAFE_NODE_NAME_LENGTH && name.getBytes(Charsets.UTF_8).length > NODE_NAME_LIMIT;

Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/resources/upgrade_usage.txt
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/resources/upgrade_usage.txt?rev=1752815&r1=1752814&r2=1752815&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/resources/upgrade_usage.txt (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/resources/upgrade_usage.txt Fri Jul 15 10:34:21 2016
@@ -91,4 +91,7 @@ An descriptor of the Oak node store. Pos
 
 # other options
 
--?, -h, --help            show help
\ No newline at end of file
+-?, -h, --help            Show help
+--skip-init               Don't initialize the destination repository
+--skip-name-check         Don't look for long-named nodes at the beginning of
+                          the migration
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/LongNameTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/LongNameTest.java?rev=1752815&r1=1752814&r2=1752815&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/LongNameTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/LongNameTest.java Fri Jul 15 10:34:21 2016
@@ -20,6 +20,7 @@ package org.apache.jackrabbit.oak.upgrad
 
 import static com.google.common.collect.Iterables.cycle;
 import static com.google.common.collect.Iterables.limit;
+import static org.junit.Assert.fail;
 
 import java.io.File;
 import java.io.IOException;
@@ -36,6 +37,7 @@ import org.apache.jackrabbit.core.Reposi
 import org.apache.jackrabbit.core.config.RepositoryConfig;
 import org.apache.jackrabbit.oak.plugins.document.DocumentMK;
 import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore;
+import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
 import org.apache.jackrabbit.oak.segment.SegmentNodeStore;
 import org.apache.jackrabbit.oak.segment.SegmentNodeStoreBuilders;
 import org.apache.jackrabbit.oak.segment.memory.MemoryStore;
@@ -44,7 +46,6 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.apache.jackrabbit.oak.stats.Clock;
 import org.junit.Assert;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 
 public class LongNameTest {
@@ -65,7 +66,8 @@ public class LongNameTest {
         FileUtils.deleteQuietly(crx2RepoDir);
 
         sourceRepositoryConfig = createCrx2Config(crx2RepoDir);
-        RepositoryImpl sourceRepository = RepositoryImpl.create(sourceRepositoryConfig);
+        RepositoryContext ctx = RepositoryContext.create(sourceRepositoryConfig);
+        RepositoryImpl sourceRepository = ctx.getRepository();
         Session session = sourceRepository.login(CREDENTIALS);
         try {
             Assert.assertTrue(TOO_LONG_NAME.getBytes().length > 150);
@@ -80,6 +82,7 @@ public class LongNameTest {
 
             Assert.assertTrue(longNameParent.hasNode(TOO_LONG_NAME));
             Assert.assertTrue(longNameParent.hasNode(NOT_TOO_LONG_NAME));
+
         } finally {
             session.logout();
         }
@@ -96,7 +99,7 @@ public class LongNameTest {
     public void longNameShouldBeSkipped() throws RepositoryException, IOException {
         DocumentNodeStore nodeStore = new DocumentMK.Builder().getNodeStore();
         try {
-            upgrade(nodeStore, true);
+            upgrade(nodeStore, false, true);
 
             NodeState parent = getParent(nodeStore.getRoot());
             Assert.assertTrue(parent.hasChildNode(NOT_TOO_LONG_NAME));
@@ -109,34 +112,50 @@ public class LongNameTest {
         }
     }
 
+    @Test
+    public void assertNoLongNamesTest() throws IOException, RepositoryException {
+        RepositoryConfig config = createCrx2Config(crx2RepoDir);
+        RepositoryContext context = RepositoryContext.create(config);
+        try {
+            RepositoryUpgrade upgrade = new RepositoryUpgrade(context, new MemoryNodeStore());
+            try {
+                upgrade.assertNoLongNames();
+                fail("Exception should be thrown");
+            } catch (RepositoryException e) {
+                // that's fine
+            }
+        } finally {
+            context.getRepository().shutdown();
+        }
+    }
+
     @Test(expected = RepositoryException.class)
-    @Ignore
     public void longNameOnDocumentStoreThrowsAnException() throws RepositoryException, IOException {
         DocumentNodeStore nodeStore = new DocumentMK.Builder().getNodeStore();
         try {
-            upgrade(nodeStore, false);
+            upgrade(nodeStore, false, false);
         } finally {
             nodeStore.dispose();
         }
     }
 
     @Test
-    @Ignore
     public void longNameOnSegmentStoreWorksFine() throws RepositoryException, IOException {
         SegmentNodeStore nodeStore = SegmentNodeStoreBuilders.builder(new MemoryStore()).build();
-        upgrade(nodeStore, false);
+        upgrade(nodeStore, false, false);
 
         NodeState parent = getParent(nodeStore.getRoot());
         Assert.assertTrue(parent.hasChildNode(NOT_TOO_LONG_NAME));
         Assert.assertTrue(parent.hasChildNode(TOO_LONG_NAME));
     }
 
-    private static void upgrade(NodeStore target, boolean skipLongNames) throws RepositoryException, IOException {
+    private static void upgrade(NodeStore target, boolean skipNameCheck, boolean filterLongNames) throws RepositoryException, IOException {
         RepositoryConfig config = createCrx2Config(crx2RepoDir);
         RepositoryContext context = RepositoryContext.create(config);
         try {
             RepositoryUpgrade upgrade = new RepositoryUpgrade(context, target);
-            upgrade.setSkipLongNames(skipLongNames);
+            upgrade.setCheckLongNames(skipNameCheck);
+            upgrade.setFilterLongNames(filterLongNames);
             upgrade.copy(null);
         } finally {
             context.getRepository().shutdown();