You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by us...@apache.org on 2012/02/27 19:45:39 UTC

svn commit: r1294266 - in /lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene: search/CheckHits.java search/QueryUtils.java util/LuceneTestCase.java

Author: uschindler
Date: Mon Feb 27 18:45:39 2012
New Revision: 1294266

URL: http://svn.apache.org/viewvc?rev=1294266&view=rev
Log:
Use the same MultiReader trick for QueryUtils, too. Now FC insanity caused by randomly wrapping readers with MultiReaders and modified segment combinations below no longer cause insanity. We still can check for insanity in production, but tests that wrap randomly for testing purposed (and behave insane) don't fail anymore.

Modified:
    lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/search/CheckHits.java
    lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/search/QueryUtils.java
    lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java

Modified: lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/search/CheckHits.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/search/CheckHits.java?rev=1294266&r1=1294265&r2=1294266&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/search/CheckHits.java (original)
+++ lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/search/CheckHits.java Mon Feb 27 18:45:39 2012
@@ -116,7 +116,6 @@ public class CheckHits {
       Assert.assertEquals("Wrap Reader " + i + ": " +
                           query.toString(defaultFieldName),
                           correct, actual);
-      QueryUtils.purgeFieldCache(s.getIndexReader()); // our wrapping can create insanity otherwise
     }
   }
 

Modified: lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/search/QueryUtils.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/search/QueryUtils.java?rev=1294266&r1=1294265&r2=1294266&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/search/QueryUtils.java (original)
+++ lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/search/QueryUtils.java Mon Feb 27 18:45:39 2012
@@ -114,13 +114,9 @@ public class QueryUtils {
         checkFirstSkipTo(q1,s);
         checkSkipTo(q1,s);
         if (wrap) {
-          IndexSearcher wrapped;
-          check(random, q1, wrapped = wrapUnderlyingReader(random, s, -1), false);
-          purgeFieldCache(wrapped.getIndexReader()); // our wrapping can create insanity otherwise
-          check(random, q1, wrapped = wrapUnderlyingReader(random, s,  0), false);
-          purgeFieldCache(wrapped.getIndexReader()); // our wrapping can create insanity otherwise
-          check(random, q1, wrapped = wrapUnderlyingReader(random, s, +1), false);
-          purgeFieldCache(wrapped.getIndexReader()); // our wrapping can create insanity otherwise
+          check(random, q1, wrapUnderlyingReader(random, s, -1), false);
+          check(random, q1, wrapUnderlyingReader(random, s,  0), false);
+          check(random, q1, wrapUnderlyingReader(random, s, +1), false);
         }
         checkExplanations(q1,s);
         
@@ -137,6 +133,27 @@ public class QueryUtils {
     // this is just a hack, to get an atomic reader that contains all subreaders for insanity checks
     FieldCache.DEFAULT.purge(SlowCompositeReaderWrapper.wrap(r));
   }
+  
+  /** This is a MultiReader that can be used for randomly wrapping other readers
+   * without creating FieldCache insanity.
+   * The trick is to use an opaque/fake cache key. */
+  public static class FCInvisibleMultiReader extends MultiReader {
+    private final Object cacheKey = new Object();
+  
+    public FCInvisibleMultiReader(IndexReader... readers) throws IOException {
+      super(readers);
+    }
+    
+    @Override
+    public Object getCoreCacheKey() {
+      return cacheKey;
+    }
+    
+    @Override
+    public Object getCombinedCoreAndDeletesKey() {
+      return cacheKey;
+    }
+  }
 
   /**
    * Given an IndexSearcher, returns a new IndexSearcher whose IndexReader 
@@ -157,17 +174,17 @@ public class QueryUtils {
     IndexReader[] readers = new IndexReader[] {
       edge < 0 ? r : emptyReaders[0],
       emptyReaders[0],
-      new MultiReader(edge < 0 ? emptyReaders[4] : emptyReaders[0],
+      new FCInvisibleMultiReader(edge < 0 ? emptyReaders[4] : emptyReaders[0],
           emptyReaders[0],
           0 == edge ? r : emptyReaders[0]),
       0 < edge ? emptyReaders[0] : emptyReaders[7],
       emptyReaders[0],
-      new MultiReader(0 < edge ? emptyReaders[0] : emptyReaders[5],
+      new FCInvisibleMultiReader(0 < edge ? emptyReaders[0] : emptyReaders[5],
           emptyReaders[0],
           0 < edge ? r : emptyReaders[0])
     };
 
-    IndexSearcher out = LuceneTestCase.newSearcher(new MultiReader(readers));
+    IndexSearcher out = LuceneTestCase.newSearcher(new FCInvisibleMultiReader(readers));
     out.setSimilarity(s.getSimilarity());
     return out;
   }

Modified: lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java?rev=1294266&r1=1294265&r2=1294266&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java (original)
+++ lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java Mon Feb 27 18:45:39 2012
@@ -57,7 +57,6 @@ import org.apache.lucene.index.AtomicRea
 import org.apache.lucene.index.CompositeReader;
 import org.apache.lucene.index.FieldFilterAtomicReader;
 import org.apache.lucene.index.FieldInfo;
-import org.apache.lucene.index.MultiReader;
 import org.apache.lucene.index.DirectoryReader;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.IndexReader.ReaderClosedListener;
@@ -83,6 +82,7 @@ import org.apache.lucene.search.IndexSea
 import org.apache.lucene.search.RandomSimilarityProvider;
 import org.apache.lucene.search.similarities.DefaultSimilarity;
 import org.apache.lucene.search.similarities.Similarity;
+import org.apache.lucene.search.QueryUtils.FCInvisibleMultiReader;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FSDirectory;
 import org.apache.lucene.store.FlushInfo;
@@ -1364,14 +1364,10 @@ public abstract class LuceneTestCase ext
               new ParallelCompositeReader((CompositeReader) r);
             break;
           case 2:
-            // Häckidy-Hick-Hack: this will create FC insanity, so we patch MultiReader to
-            // return a fake cache key, so insanity checker cannot walk along our reader:
-            r = new MultiReader(r) {
-              private final Object cacheKey = new Object();
-              @Override public Object getCoreCacheKey() { return cacheKey; }
-              @Override public Object getCombinedCoreAndDeletesKey() { return cacheKey; }
-              @Override public String toString() { return "MultiReader(" + subReaders[0] + ")"; }
-            };
+            // Häckidy-Hick-Hack: a standard MultiReader will cause FC insanity, so we use
+            // QueryUtils' reader with a fake cache key, so insanity checker cannot walk
+            // along our reader:
+            r = new FCInvisibleMultiReader(r);
             break;
           case 3:
             final AtomicReader ar = SlowCompositeReaderWrapper.wrap(r);