Author: chetanm
Date: Thu Jun 30 17:24:01 2016
New Revision: 1750842

URL: http://svn.apache.org/viewvc?rev=1750842&view=rev
Log:
OAK-3629 - Index corruption seen with CopyOnRead when index defnition is 
recreated

Support folder name to include multiple path element (for now restricted to 2). 
So
- /oak:index/fooIndex -> fooIndex
- /content/oak:index/fooIndex -> content_fooIndex

Modified:
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexRootDirectory.java
    
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexRootDirectoryTest.java

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexRootDirectory.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexRootDirectory.java?rev=1750842&r1=1750841&r2=1750842&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexRootDirectory.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexRootDirectory.java
 Thu Jun 30 17:24:01 2016
@@ -29,7 +29,9 @@ import java.util.List;
 import java.util.Map;
 
 import com.google.common.base.Charsets;
+import com.google.common.base.Joiner;
 import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -42,6 +44,7 @@ import org.apache.jackrabbit.oak.stats.C
 import static com.google.common.base.Preconditions.checkState;
 
 public class IndexRootDirectory {
+    static final int MAX_NAME_LENGTH = 127;
     public static final String INDEX_METADATA_FILE_NAME = "index-details.txt";
 
     private final File indexRootDir;
@@ -110,11 +113,35 @@ public class IndexRootDirectory {
         return result == null ? Collections.<LocalIndexDir>emptyList() : 
result;
     }
 
+    /**
+     * <ul>
+     *     <li>abc -> abc</li>
+     *     <li>xy:abc -> xyabc</li>
+     *     <li>/oak:index/abc -> abc</li>
+     * </ul>
+     *
+     * The resulting file name would be truncated to MAX_NAME_LENGTH
+     */
     static String getIndexFolderBaseName(String indexPath) {
-        String nodeName = PathUtils.getName(indexPath);
+        List<String> elements = 
Lists.newArrayList(PathUtils.elements(indexPath));
+        Collections.reverse(elements);
+        List<String> result = Lists.newArrayListWithCapacity(2);
+
+        //Max 3 nodeNames including oak:index which is the immediate parent 
for any indexPath
+        for (String e : Iterables.limit(elements, 3)) {
+            if ("oak:index".equals(e)) {
+                continue;
+            }
+            //Strip of any char outside of a-zA-Z0-9-
+            result.add(e.replaceAll("\\W", ""));
+        }
 
-        //Strip of any char outside of a-zA-Z0-9-
-        return nodeName.replaceAll("\\W+", "");
+        Collections.reverse(result);
+        String name = Joiner.on('_').join(result);
+        if (name.length() > MAX_NAME_LENGTH){
+            name = name.substring(0, MAX_NAME_LENGTH);
+        }
+        return name;
     }
 
     static String getPathHash(String indexPath) {

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexRootDirectoryTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexRootDirectoryTest.java?rev=1750842&r1=1750841&r2=1750842&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexRootDirectoryTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexRootDirectoryTest.java
 Thu Jun 30 17:24:01 2016
@@ -22,6 +22,7 @@ package org.apache.jackrabbit.oak.plugin
 import java.io.File;
 import java.util.List;
 
+import com.google.common.base.Strings;
 import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
 import org.apache.jackrabbit.oak.plugins.index.lucene.IndexDefinition;
 import org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexEditorContext;
@@ -108,6 +109,28 @@ public class IndexRootDirectoryTest {
         assertEquals(fa2.getParentFile().getAbsolutePath(), getDir("/a", 
dirs).getFSPath());
     }
 
+    @Test
+    public void indexFolderName() throws Exception{
+        assertEquals("abc", IndexRootDirectory.getIndexFolderBaseName("/abc"));
+        assertEquals("abc12", 
IndexRootDirectory.getIndexFolderBaseName("/abc12"));
+        assertEquals("xyabc12", 
IndexRootDirectory.getIndexFolderBaseName("/xy:abc12"));
+        assertEquals("xyabc12", 
IndexRootDirectory.getIndexFolderBaseName("/xy:abc#^&12"));
+        assertEquals("xyabc12", 
IndexRootDirectory.getIndexFolderBaseName("/oak:index/xy:abc12"));
+        assertEquals("content_xyabc12", 
IndexRootDirectory.getIndexFolderBaseName("/content/oak:index/xy:abc12"));
+        assertEquals("sales_xyabc12", 
IndexRootDirectory.getIndexFolderBaseName("/content/sales/oak:index/xy:abc12"));
+        assertEquals("appsales_xyabc12", 
IndexRootDirectory.getIndexFolderBaseName
+                ("/content/app:sales/oak:index/xy:abc12"));
+    }
+
+    @Test
+    public void longFileName() throws Exception{
+        String longName = Strings.repeat("x", 
IndexRootDirectory.MAX_NAME_LENGTH);
+        assertEquals(longName, 
IndexRootDirectory.getIndexFolderBaseName(longName));
+
+        String longName2 = Strings.repeat("x", 
IndexRootDirectory.MAX_NAME_LENGTH + 10);
+        assertEquals(longName, 
IndexRootDirectory.getIndexFolderBaseName(longName2));
+    }
+
     private NodeBuilder resetBuilder() {
         builder = EMPTY_NODE.builder();
         return builder;


Reply via email to