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++) {