Author: catholicon
Date: Thu Nov  2 22:26:27 2017
New Revision: 1814119

URL: http://svn.apache.org/viewvc?rev=1814119&view=rev
Log:
OAK-6775: Suggest directory should utilize CopyOnRead if available

While CoR was fairly simply done, but it revealed that suggester CoW
could collide with data direcotry for old format (uuid/reindex-count
based name). Fixing that here.

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

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/DefaultDirectoryFactory.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/DefaultDirectoryFactory.java?rev=1814119&r1=1814118&r2=1814119&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/DefaultDirectoryFactory.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/DefaultDirectoryFactory.java
 Thu Nov  2 22:26:27 2017
@@ -33,6 +33,7 @@ import org.apache.lucene.store.Directory
 import org.apache.lucene.store.FSDirectory;
 
 import static 
org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.PERSISTENCE_PATH;
+import static 
org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.SUGGEST_DATA_CHILD_NAME;
 import static org.apache.lucene.store.NoLockFactory.getNoLockFactory;
 
 public class DefaultDirectoryFactory implements DirectoryFactory {
@@ -54,7 +55,7 @@ public class DefaultDirectoryFactory imp
     public Directory newInstance(IndexDefinition definition, NodeBuilder 
builder,
                                  String dirName, boolean reindex) throws 
IOException {
         Directory directory = newIndexDirectory(definition, builder, dirName);
-        if (indexCopier != null) {
+        if (indexCopier != null && !(SUGGEST_DATA_CHILD_NAME.equals(dirName) 
&& definition.getUniqueId() == null)) {
             directory = indexCopier.wrapForWrite(definition, directory, 
reindex, dirName);
         }
         return directory;

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/CopyOnWriteDirectoryTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/CopyOnWriteDirectoryTest.java?rev=1814119&r1=1814118&r2=1814119&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/CopyOnWriteDirectoryTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/CopyOnWriteDirectoryTest.java
 Thu Nov  2 22:26:27 2017
@@ -27,6 +27,7 @@ import java.util.concurrent.ThreadFactor
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import com.google.common.io.Closer;
 import org.apache.jackrabbit.oak.plugins.document.DocumentMKBuilderProvider;
 import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore;
 import org.apache.jackrabbit.oak.plugins.index.lucene.IndexCopier;
@@ -39,12 +40,21 @@ import org.apache.lucene.store.Directory
 import org.apache.lucene.store.IOContext;
 import org.apache.lucene.store.IndexOutput;
 import org.junit.After;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 
+import static 
org.apache.jackrabbit.oak.plugins.index.lucene.IndexDefinition.PROP_UID;
+import static 
org.apache.jackrabbit.oak.plugins.index.lucene.IndexDefinition.STATUS_NODE;
 import static 
org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.INDEX_DATA_CHILD_NAME;
+import static 
org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.SUGGEST_DATA_CHILD_NAME;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 public class CopyOnWriteDirectoryTest {
 
@@ -97,6 +107,42 @@ public class CopyOnWriteDirectoryTest {
         ns.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
     }
 
+    // OAK-6775
+    @Test
+    public void suggestDirUseCOWOnlyWhenItGetUniqueFSFolder() throws Exception 
{
+        Closer closer = Closer.create();
+        try {
+            NodeBuilder builder = ns.getRoot().builder().child("foo");
+
+            IndexDefinition def = new IndexDefinition(ns.getRoot(), 
builder.getNodeState(), "/foo");
+            Directory dir = new DefaultDirectoryFactory(copier, 
null).newInstance(def, builder.child("foo"), INDEX_DATA_CHILD_NAME, false);
+            Directory suggestDir = new DefaultDirectoryFactory(copier, 
null).newInstance(def, builder.child("foo"), SUGGEST_DATA_CHILD_NAME, false);
+
+            closer.register(dir);
+            closer.register(suggestDir);
+
+            assertTrue("Data directory not COW-wrapped", dir instanceof 
CopyOnWriteDirectory);
+            assertFalse("Suggester directory COW-wrapped", suggestDir 
instanceof CopyOnWriteDirectory);
+
+            builder.child(STATUS_NODE).setProperty(PROP_UID, 
"some_random_string");
+            def = new IndexDefinition(ns.getRoot(), builder.getNodeState(), 
"/foo");
+
+            assertNotNull("Synthetic UID not read by definition", 
def.getUniqueId());
+
+            dir = new DefaultDirectoryFactory(copier, null).newInstance(def, 
builder.child("foo"), INDEX_DATA_CHILD_NAME, false);
+            Directory dir1 = new DefaultDirectoryFactory(copier, 
null).newInstance(def, builder.child("foo"), INDEX_DATA_CHILD_NAME, false);
+            suggestDir = new DefaultDirectoryFactory(copier, 
null).newInstance(def, builder.child("foo"), SUGGEST_DATA_CHILD_NAME, false);
+
+            closer.register(dir);
+            closer.register(suggestDir);
+
+            assertTrue("Data directory not COW-wrapped", dir instanceof 
CopyOnWriteDirectory);
+            assertTrue("Suggester directory not COW-wrapped", suggestDir 
instanceof CopyOnWriteDirectory);
+        } finally {
+            closer.close();
+        }
+    }
+
     private void writeTree(NodeBuilder builder) {
         NodeBuilder test = builder.child("test");
         for (int i = 0; i < 100; i++) {


Reply via email to