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;