You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by si...@apache.org on 2015/04/01 16:07:39 UTC

svn commit: r1670654 - in /lucene/dev/branches/branch_5x: ./ lucene/ lucene/core/ lucene/core/src/java/org/apache/lucene/search/ lucene/core/src/test/org/apache/lucene/search/ lucene/facet/ lucene/facet/src/java/org/apache/lucene/facet/taxonomy/

Author: simonw
Date: Wed Apr  1 14:07:38 2015
New Revision: 1670654

URL: http://svn.apache.org/r1670654
Log:
LUCENE-6377: Pass previous reader to SearcherFactory#newSearcher

Modified:
    lucene/dev/branches/branch_5x/   (props changed)
    lucene/dev/branches/branch_5x/lucene/   (props changed)
    lucene/dev/branches/branch_5x/lucene/CHANGES.txt   (contents, props changed)
    lucene/dev/branches/branch_5x/lucene/core/   (props changed)
    lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/SearcherFactory.java
    lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/SearcherManager.java
    lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestControlledRealTimeReopenThread.java
    lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestLRUFilterCache.java
    lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestLRUQueryCache.java
    lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestLiveFieldValues.java
    lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestSearcherManager.java
    lucene/dev/branches/branch_5x/lucene/facet/   (props changed)
    lucene/dev/branches/branch_5x/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/SearcherTaxonomyManager.java

Modified: lucene/dev/branches/branch_5x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/CHANGES.txt?rev=1670654&r1=1670653&r2=1670654&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_5x/lucene/CHANGES.txt Wed Apr  1 14:07:38 2015
@@ -24,6 +24,11 @@ Bug Fixes
 * LUCENE-6378: Fix all RuntimeExceptions to throw the underlying root cause.
   (Varun Thacker, Adrien Grand, Mike McCandless)
 
+API Changes
+
+* LUCENE-6377: SearcherFactory#newSearcher now accepts the previous reader
+  to simplify warming logic during opening new searchers. (Simon Willnauer)
+
 ======================= Lucene 5.1.0 =======================
 
 New Features

Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/SearcherFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/SearcherFactory.java?rev=1670654&r1=1670653&r2=1670654&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/SearcherFactory.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/SearcherFactory.java Wed Apr  1 14:07:38 2015
@@ -49,9 +49,15 @@ import org.apache.lucene.search.similari
  */
 public class SearcherFactory {
   /** 
-   * Returns a new IndexSearcher over the given reader. 
+   * Returns a new IndexSearcher over the given reader.
+   * @param reader the reader to create a new searcher for
+   * @param previousReader the reader previously used to create a new searcher.
+   *                       This can be <code>null</code> if unknown or if the given reader is the initially opened reader.
+   *                       If this reader is non-null it can be used to find newly opened segments compared to the new reader to warm
+   *                       the searcher up before returning.
    */
-  public IndexSearcher newSearcher(IndexReader reader) throws IOException {
+  public IndexSearcher newSearcher(IndexReader reader, IndexReader previousReader) throws IOException {
     return new IndexSearcher(reader);
   }
+
 }

Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/SearcherManager.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/SearcherManager.java?rev=1670654&r1=1670653&r2=1670654&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/SearcherManager.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/SearcherManager.java Wed Apr  1 14:07:38 2015
@@ -86,7 +86,7 @@ public final class SearcherManager exten
       searcherFactory = new SearcherFactory();
     }
     this.searcherFactory = searcherFactory;
-    current = getSearcher(searcherFactory, DirectoryReader.open(writer, applyAllDeletes));
+    current = getSearcher(searcherFactory, DirectoryReader.open(writer, applyAllDeletes), null);
   }
   
   /**
@@ -103,7 +103,7 @@ public final class SearcherManager exten
       searcherFactory = new SearcherFactory();
     }
     this.searcherFactory = searcherFactory;
-    current = getSearcher(searcherFactory, DirectoryReader.open(dir));
+    current = getSearcher(searcherFactory, DirectoryReader.open(dir), null);
   }
 
   /**
@@ -122,7 +122,7 @@ public final class SearcherManager exten
       searcherFactory = new SearcherFactory();
     }
     this.searcherFactory = searcherFactory;
-    this.current = getSearcher(searcherFactory, reader);
+    this.current = getSearcher(searcherFactory, reader, null);
   }
 
   @Override
@@ -138,7 +138,7 @@ public final class SearcherManager exten
     if (newReader == null) {
       return null;
     } else {
-      return getSearcher(searcherFactory, newReader);
+      return getSearcher(searcherFactory, newReader, r);
     }
   }
   
@@ -172,11 +172,11 @@ public final class SearcherManager exten
    *  IndexReader} using the provided {@link
    *  SearcherFactory}.  NOTE: this decRefs incoming reader
    * on throwing an exception. */
-  public static IndexSearcher getSearcher(SearcherFactory searcherFactory, IndexReader reader) throws IOException {
+  public static IndexSearcher getSearcher(SearcherFactory searcherFactory, IndexReader reader, IndexReader previousReader) throws IOException {
     boolean success = false;
     final IndexSearcher searcher;
     try {
-      searcher = searcherFactory.newSearcher(reader);
+      searcher = searcherFactory.newSearcher(reader, previousReader);
       if (searcher.getIndexReader() != reader) {
         throw new IllegalStateException("SearcherFactory must wrap exactly the provided reader (got " + searcher.getIndexReader() + " but expected " + reader + ")");
       }

Modified: lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestControlledRealTimeReopenThread.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestControlledRealTimeReopenThread.java?rev=1670654&r1=1670653&r2=1670654&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestControlledRealTimeReopenThread.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestControlledRealTimeReopenThread.java Wed Apr  1 14:07:38 2015
@@ -219,7 +219,7 @@ public class TestControlledRealTimeReope
 
     final SearcherFactory sf = new SearcherFactory() {
         @Override
-        public IndexSearcher newSearcher(IndexReader r) throws IOException {
+        public IndexSearcher newSearcher(IndexReader r, IndexReader previous) throws IOException {
           TestControlledRealTimeReopenThread.this.warmCalled = true;
           IndexSearcher s = new IndexSearcher(r, es);
           s.search(new TermQuery(new Term("body", "united")), 10);
@@ -413,7 +413,7 @@ public class TestControlledRealTimeReope
 
     final SearcherFactory theEvilOne = new SearcherFactory() {
       @Override
-      public IndexSearcher newSearcher(IndexReader ignored) {
+      public IndexSearcher newSearcher(IndexReader ignored, IndexReader previous) {
         return LuceneTestCase.newSearcher(other);
       }
       };

Modified: lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestLRUFilterCache.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestLRUFilterCache.java?rev=1670654&r1=1670653&r2=1670654&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestLRUFilterCache.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestLRUFilterCache.java Wed Apr  1 14:07:38 2015
@@ -88,7 +88,7 @@ public class TestLRUFilterCache extends
     final RandomIndexWriter w = new RandomIndexWriter(random(), dir);
     final SearcherManager mgr = new SearcherManager(w.w, random().nextBoolean(), new SearcherFactory() {
       @Override
-      public IndexSearcher newSearcher(IndexReader reader) throws IOException {
+      public IndexSearcher newSearcher(IndexReader reader, IndexReader previousReader) throws IOException {
         IndexSearcher searcher = new IndexSearcher(reader);
         // disable built-in caching
         searcher.setQueryCache(null);

Modified: lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestLRUQueryCache.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestLRUQueryCache.java?rev=1670654&r1=1670653&r2=1670654&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestLRUQueryCache.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestLRUQueryCache.java Wed Apr  1 14:07:38 2015
@@ -83,7 +83,7 @@ public class TestLRUQueryCache extends L
     final RandomIndexWriter w = new RandomIndexWriter(random(), dir);
     final SearcherFactory searcherFactory = new SearcherFactory() {
       @Override
-      public IndexSearcher newSearcher(IndexReader reader) throws IOException {
+      public IndexSearcher newSearcher(IndexReader reader, IndexReader previous) throws IOException {
         IndexSearcher searcher = new IndexSearcher(reader);
         searcher.setQueryCachingPolicy(MAYBE_CACHE_POLICY);
         searcher.setQueryCache(queryCache);

Modified: lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestLiveFieldValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestLiveFieldValues.java?rev=1670654&r1=1670653&r2=1670654&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestLiveFieldValues.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestLiveFieldValues.java Wed Apr  1 14:07:38 2015
@@ -50,7 +50,7 @@ public class TestLiveFieldValues extends
 
     final SearcherManager mgr = new SearcherManager(w, true, new SearcherFactory() {
         @Override
-        public IndexSearcher newSearcher(IndexReader r) {
+        public IndexSearcher newSearcher(IndexReader r, IndexReader previous) {
           return new IndexSearcher(r);
         }
       });

Modified: lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestSearcherManager.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestSearcherManager.java?rev=1670654&r1=1670653&r2=1670654&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestSearcherManager.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestSearcherManager.java Wed Apr  1 14:07:38 2015
@@ -78,7 +78,7 @@ public class TestSearcherManager extends
   protected void doAfterWriter(final ExecutorService es) throws Exception {
     final SearcherFactory factory = new SearcherFactory() {
       @Override
-      public IndexSearcher newSearcher(IndexReader r) throws IOException {
+      public IndexSearcher newSearcher(IndexReader r, IndexReader previous) throws IOException {
         IndexSearcher s = new IndexSearcher(r, es);
         TestSearcherManager.this.warmCalled = true;
         s.search(new TermQuery(new Term("body", "united")), 10);
@@ -217,7 +217,7 @@ public class TestSearcherManager extends
     final ExecutorService es = random().nextBoolean() ? null : Executors.newCachedThreadPool(new NamedThreadFactory("testIntermediateClose"));
     final SearcherFactory factory = new SearcherFactory() {
       @Override
-      public IndexSearcher newSearcher(IndexReader r) {
+      public IndexSearcher newSearcher(IndexReader r, IndexReader previous) {
         try {
           if (triedReopen.get()) {
             awaitEnterWarm.countDown();
@@ -400,7 +400,7 @@ public class TestSearcherManager extends
 
     final SearcherFactory theEvilOne = new SearcherFactory() {
       @Override
-      public IndexSearcher newSearcher(IndexReader ignored) {
+      public IndexSearcher newSearcher(IndexReader ignored, IndexReader previous) {
         return LuceneTestCase.newSearcher(other);
       }
       };
@@ -503,4 +503,47 @@ public class TestSearcherManager extends
     w.close();
     dir.close();
   }
+
+  public void testPreviousReaderIsPassed() throws IOException {
+    final Directory dir = newDirectory();
+    final IndexWriter w = new IndexWriter(dir, newIndexWriterConfig());
+    w.addDocument(new Document());
+    class MySearcherFactory extends SearcherFactory {
+      IndexReader lastReader = null;
+      IndexReader lastPreviousReader = null;
+      int called = 0;
+      @Override
+      public IndexSearcher newSearcher(IndexReader reader, IndexReader previousReader) throws IOException {
+        called++;
+        lastReader = reader;
+        lastPreviousReader = previousReader;
+        return super.newSearcher(reader, previousReader);
+      }
+    }
+
+    MySearcherFactory factory = new MySearcherFactory();
+    final SearcherManager sm = new SearcherManager(w, random().nextBoolean(), factory);
+    assertEquals(1, factory.called);
+    assertNull(factory.lastPreviousReader);
+    assertNotNull(factory.lastReader);
+    IndexSearcher acquire = sm.acquire();
+    assertSame(factory.lastReader, acquire.getIndexReader());
+    sm.release(acquire);
+
+    final IndexReader lastReader = factory.lastReader;
+    // refresh
+    w.addDocument(new Document());
+    assertTrue(sm.maybeRefresh());
+
+    acquire = sm.acquire();
+    assertSame(factory.lastReader, acquire.getIndexReader());
+    sm.release(acquire);
+    assertNotNull(factory.lastPreviousReader);
+    assertSame(lastReader, factory.lastPreviousReader);
+    assertNotSame(factory.lastReader, lastReader);
+    assertEquals(2, factory.called);
+    w.close();
+    sm.close();
+    dir.close();
+  }
 }

Modified: lucene/dev/branches/branch_5x/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/SearcherTaxonomyManager.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/SearcherTaxonomyManager.java?rev=1670654&r1=1670653&r2=1670654&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/SearcherTaxonomyManager.java (original)
+++ lucene/dev/branches/branch_5x/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/SearcherTaxonomyManager.java Wed Apr  1 14:07:38 2015
@@ -70,7 +70,7 @@ public class SearcherTaxonomyManager ext
     this.searcherFactory = searcherFactory;
     this.taxoWriter = taxoWriter;
     DirectoryTaxonomyReader taxoReader = new DirectoryTaxonomyReader(taxoWriter);
-    current = new SearcherAndTaxonomy(SearcherManager.getSearcher(searcherFactory, DirectoryReader.open(writer, applyAllDeletes)), taxoReader);
+    current = new SearcherAndTaxonomy(SearcherManager.getSearcher(searcherFactory, DirectoryReader.open(writer, applyAllDeletes), null), taxoReader);
     this.taxoEpoch = taxoWriter.getTaxonomyEpoch();
   }
 
@@ -88,7 +88,7 @@ public class SearcherTaxonomyManager ext
     }
     this.searcherFactory = searcherFactory;
     DirectoryTaxonomyReader taxoReader = new DirectoryTaxonomyReader(taxoDir);
-    current = new SearcherAndTaxonomy(SearcherManager.getSearcher(searcherFactory, DirectoryReader.open(indexDir)), taxoReader);
+    current = new SearcherAndTaxonomy(SearcherManager.getSearcher(searcherFactory, DirectoryReader.open(indexDir), null), taxoReader);
     this.taxoWriter = null;
     taxoEpoch = -1;
   }
@@ -138,7 +138,7 @@ public class SearcherTaxonomyManager ext
         throw new IllegalStateException("DirectoryTaxonomyWriter.replaceTaxonomy was called, which is not allowed when using SearcherTaxonomyManager");
       }
 
-      return new SearcherAndTaxonomy(SearcherManager.getSearcher(searcherFactory, newReader), tr);
+      return new SearcherAndTaxonomy(SearcherManager.getSearcher(searcherFactory, newReader, r), tr);
     }
   }