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());
     }
 


Reply via email to