Author: thomasm
Date: Tue Nov 22 13:36:19 2016
New Revision: 1770834

URL: http://svn.apache.org/viewvc?rev=1770834&view=rev
Log:
OAK-4096 Limit the number of times a LuceneResultRow based iterator get reset

Modified:
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java?rev=1770834&r1=1770833&r2=1770834&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java
 Tue Nov 22 13:36:19 2016
@@ -165,6 +165,8 @@ public class LuceneIndex implements Adva
 
     static final boolean USE_PATH_RESTRICTION = 
Boolean.getBoolean("oak.luceneUsePath");
 
+    static final int MAX_RELOAD_COUNT = 
Integer.getInteger("oak.luceneMaxReloadCount", 16);
+
     protected final IndexTracker tracker;
 
     private final NodeAggregator aggregator;
@@ -289,6 +291,7 @@ public class LuceneIndex implements Adva
             private int nextBatchSize = LUCENE_QUERY_BATCH_SIZE;
             private boolean noDocs = false;
             private long lastSearchIndexerVersion;
+            private int reloadCount;
 
             @Override
             protected LuceneResultRow computeNext() {
@@ -457,9 +460,16 @@ public class LuceneIndex implements Adva
             private void checkForIndexVersionChange(IndexSearcher searcher) {
                 long currentVersion = LucenePropertyIndex.getVersion(searcher);
                 if (currentVersion != lastSearchIndexerVersion && lastDoc != 
null){
+                    reloadCount++;
+                    if (reloadCount > MAX_RELOAD_COUNT) {
+                        LOG.error("More than {} index version changes detected 
for query {}", 
+                                MAX_RELOAD_COUNT, 
+                                plan);
+                        throw new IllegalStateException("Too many version 
changes");
+                    }
                     lastDoc = null;
                     LOG.debug("Change in index version detected {} => {}. 
Query would be performed without " +
-                            "offset", currentVersion, 
lastSearchIndexerVersion);
+                            "offset; reload {}", currentVersion, 
lastSearchIndexerVersion, reloadCount);
                 }
                 this.lastSearchIndexerVersion = currentVersion;
             }


Reply via email to