Author: chetanm
Date: Mon Oct 10 09:56:57 2016
New Revision: 1764047
URL: http://svn.apache.org/viewvc?rev=1764047&view=rev
Log:
OAK-4909 - NRTIndex can get closed while in use
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/hybrid/NRTIndexFactory.java
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/hybrid/NRTIndexFactoryTest.java
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/hybrid/NRTIndexFactory.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/hybrid/NRTIndexFactory.java?rev=1764047&r1=1764046&r2=1764047&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/hybrid/NRTIndexFactory.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/hybrid/NRTIndexFactory.java
Mon Oct 10 09:56:57 2016
@@ -38,6 +38,12 @@ import static com.google.common.base.Pre
import static com.google.common.base.Preconditions.checkNotNull;
public class NRTIndexFactory implements Closeable{
+ /**
+ * Maximum numbers of NRTIndex to keep at a time. At runtime for a given
index
+ * /oak:index/fooIndex at max 2 IndexNode would be opened at a time and
those 2
+ * IndexNode would keep reference to at max 3 NRT Indexes
+ */
+ private static final int MAX_INDEX_COUNT = 3;
private final Logger log = LoggerFactory.getLogger(getClass());
private final ListMultimap<String, NRTIndex> indexes =
LinkedListMultimap.create();
private final IndexCopier indexCopier;
@@ -82,7 +88,7 @@ public class NRTIndexFactory implements
private void closeLast(String indexPath) {
List<NRTIndex> existing = indexes.get(indexPath);
- if (existing.size() < 3){
+ if (existing.size() <= MAX_INDEX_COUNT){
return;
}
NRTIndex oldest = existing.remove(0);
@@ -98,7 +104,7 @@ public class NRTIndexFactory implements
if (existing.isEmpty()){
return null;
}
- checkArgument(existing.size() <= 2, "Found [%s] more than 3 index",
existing.size());
+ checkArgument(existing.size() <= MAX_INDEX_COUNT, "Found [%s] more
than 3 index", existing.size());
return existing.get(existing.size() - 1);
}
Modified:
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/hybrid/NRTIndexFactoryTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/hybrid/NRTIndexFactoryTest.java?rev=1764047&r1=1764046&r2=1764047&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/hybrid/NRTIndexFactoryTest.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/hybrid/NRTIndexFactoryTest.java
Mon Oct 10 09:56:57 2016
@@ -95,9 +95,19 @@ public class NRTIndexFactoryTest {
assertFalse(idx1.isClosed());
NRTIndex idx3 = indexFactory.createIndex(idxDefn);
- assertEquals(2, indexFactory.getIndexes("/foo").size());
+ assertFalse(idx1.isClosed());
+ assertEquals(3, indexFactory.getIndexes("/foo").size());
+
+ //Nothing index so size is zero
+ assertEquals(0, idx2.getReaders().size());
+ assertEquals(0, idx3.getReaders().size());
+
+ NRTIndex idx4 = indexFactory.createIndex(idxDefn);
+ assertEquals(3, indexFactory.getIndexes("/foo").size());
- //With 2 generation open the first one should be closed
+ assertEquals(0, idx3.getReaders().size());
+ assertEquals(0, idx4.getReaders().size());
+ //With 3 generation open the first one should be closed
assertTrue(idx1.isClosed());
}