You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2011/10/11 00:16:39 UTC

svn commit: r1181275 - in /lucene/dev/branches/branch_3x: ./ lucene/ lucene/backwards/src/test/ lucene/contrib/ lucene/contrib/misc/src/java/org/apache/lucene/search/ lucene/contrib/misc/src/test/org/apache/lucene/search/ solr/

Author: mikemccand
Date: Mon Oct 10 22:16:39 2011
New Revision: 1181275

URL: http://svn.apache.org/viewvc?rev=1181275&view=rev
Log:
LUCENE-3486: add SearcherLifetimeManager, so you can easily retrieve the same searcher you previously used

Added:
    lucene/dev/branches/branch_3x/lucene/contrib/misc/src/java/org/apache/lucene/search/SearcherLifetimeManager.java
      - copied, changed from r1181265, lucene/dev/trunk/lucene/contrib/misc/src/java/org/apache/lucene/search/SearcherLifetimeManager.java
Modified:
    lucene/dev/branches/branch_3x/   (props changed)
    lucene/dev/branches/branch_3x/lucene/   (props changed)
    lucene/dev/branches/branch_3x/lucene/backwards/src/test/   (props changed)
    lucene/dev/branches/branch_3x/lucene/contrib/CHANGES.txt
    lucene/dev/branches/branch_3x/lucene/contrib/misc/src/test/org/apache/lucene/search/TestSearcherManager.java
    lucene/dev/branches/branch_3x/solr/   (props changed)

Modified: lucene/dev/branches/branch_3x/lucene/contrib/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/contrib/CHANGES.txt?rev=1181275&r1=1181274&r2=1181275&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/contrib/CHANGES.txt (original)
+++ lucene/dev/branches/branch_3x/lucene/contrib/CHANGES.txt Mon Oct 10 22:16:39 2011
@@ -31,6 +31,11 @@ New Features
    refCount is used to safely close the reader only once all threads are done
    using it.  (Michael McCandless)
 
+ * LUCENE-3486: Add SearcherLifetimeManager, to manage retrieving the
+   same searcher used in a previous search to ensure follow-on actions
+   (next page, drill down, etc.) use the same searcher as before (Mike
+   McCandless)
+
 API Changes
 
  * LUCENE-3431: Deprecated QueryAutoStopWordAnalyzer.addStopWords* since they

Copied: lucene/dev/branches/branch_3x/lucene/contrib/misc/src/java/org/apache/lucene/search/SearcherLifetimeManager.java (from r1181265, lucene/dev/trunk/lucene/contrib/misc/src/java/org/apache/lucene/search/SearcherLifetimeManager.java)
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/contrib/misc/src/java/org/apache/lucene/search/SearcherLifetimeManager.java?p2=lucene/dev/branches/branch_3x/lucene/contrib/misc/src/java/org/apache/lucene/search/SearcherLifetimeManager.java&p1=lucene/dev/trunk/lucene/contrib/misc/src/java/org/apache/lucene/search/SearcherLifetimeManager.java&r1=1181265&r2=1181275&rev=1181275&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/contrib/misc/src/java/org/apache/lucene/search/SearcherLifetimeManager.java (original)
+++ lucene/dev/branches/branch_3x/lucene/contrib/misc/src/java/org/apache/lucene/search/SearcherLifetimeManager.java Mon Oct 10 22:16:39 2011
@@ -25,7 +25,9 @@ import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.lucene.index.IndexReader;        // javadocs
 import org.apache.lucene.index.NRTManager;        // javadocs
+import org.apache.lucene.search.IndexSearcher;        // javadocs
 import org.apache.lucene.store.AlreadyClosedException;
 import org.apache.lucene.util.IOUtils;
 
@@ -112,7 +114,6 @@ public class SearcherLifetimeManager imp
     }
 
     // Newer searchers are sort before older ones:
-    @Override
     public int compareTo(SearcherTracker other) {
       // Be defensive: cannot subtract since it could
       // technically overflow long, though, we'd never hit
@@ -126,7 +127,6 @@ public class SearcherLifetimeManager imp
       }
     }
 
-    @Override
     public synchronized void close() throws IOException {
       searcher.getIndexReader().decRef();
     }
@@ -234,7 +234,6 @@ public class SearcherLifetimeManager imp
       this.maxAgeSec = maxAgeSec;
     }
 
-    @Override
     public boolean doPrune(int ageSec, IndexSearcher searcher) {
       return ageSec > maxAgeSec;
     }
@@ -270,7 +269,6 @@ public class SearcherLifetimeManager imp
    *  calling {@link #record} while you call close();
    *  otherwise it's possible not all searcher references
    *  will be freed. */
-  @Override
   public synchronized void close() throws IOException {
     closed = true;
     final List<SearcherTracker> toClose = new ArrayList<SearcherTracker>(searchers.values());

Modified: lucene/dev/branches/branch_3x/lucene/contrib/misc/src/test/org/apache/lucene/search/TestSearcherManager.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/contrib/misc/src/test/org/apache/lucene/search/TestSearcherManager.java?rev=1181275&r1=1181274&r2=1181275&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/contrib/misc/src/test/org/apache/lucene/search/TestSearcherManager.java (original)
+++ lucene/dev/branches/branch_3x/lucene/contrib/misc/src/test/org/apache/lucene/search/TestSearcherManager.java Mon Oct 10 22:16:39 2011
@@ -20,6 +20,8 @@ package org.apache.lucene.search;
 import java.io.IOException;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
+import java.util.List;
+import java.util.ArrayList;
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -38,7 +40,10 @@ public class TestSearcherManager extends
 
   boolean warmCalled;
 
+  private SearcherLifetimeManager.Pruner pruner;
+
   public void testSearcherManager() throws Exception {
+    pruner = new SearcherLifetimeManager.PruneByAge(TEST_NIGHTLY ? _TestUtil.nextInt(random, 1, 20) : 1);
     runTest("TestSearcherManager");
   }
 
@@ -52,6 +57,8 @@ public class TestSearcherManager extends
   }
 
   private SearcherManager mgr;
+  private SearcherLifetimeManager lifetimeMGR;
+  private final List<Long> pastSearchers = new ArrayList<Long>();
   private boolean isNRT;
 
   @Override
@@ -71,6 +78,8 @@ public class TestSearcherManager extends
       mgr = SearcherManager.open(dir, warmer, es);
       isNRT = false;
     }
+
+    lifetimeMGR = new SearcherLifetimeManager();
   }
 
   @Override
@@ -84,7 +93,9 @@ public class TestSearcherManager extends
             Thread.sleep(_TestUtil.nextInt(random, 1, 100));
             writer.commit();
             Thread.sleep(_TestUtil.nextInt(random, 1, 5));
-            mgr.maybeReopen();
+            if (mgr.maybeReopen()) {
+              lifetimeMGR.prune(pruner);
+            }
           }
         } catch (Throwable t) {
           System.out.println("TEST: reopen thread hit exc");
@@ -109,15 +120,48 @@ public class TestSearcherManager extends
       // synchronous to your search threads, but still we
       // test as apps will presumably do this for
       // simplicity:
-      mgr.maybeReopen();
+      if (mgr.maybeReopen()) {
+        lifetimeMGR.prune(pruner);
+      }
     }
 
-    return mgr.acquire();
+    IndexSearcher s = null;
+
+    synchronized(pastSearchers) {
+      while (pastSearchers.size() != 0 && random.nextDouble() < 0.25) {
+        // 1/4 of the time pull an old searcher, ie, simulate
+        // a user doing a follow-on action on a previous
+        // search (drilling down/up, clicking next/prev page,
+        // etc.)
+        final Long token = pastSearchers.get(random.nextInt(pastSearchers.size()));
+        s = lifetimeMGR.acquire(token);
+        if (s == null) {
+          // Searcher was pruned
+          pastSearchers.remove(token);
+        } else {
+          break;
+        }
+      }
+    }
+
+    if (s == null) {
+      s = mgr.acquire();
+      if (s.getIndexReader().numDocs() != 0) {
+        Long token = lifetimeMGR.record(s);
+        synchronized(pastSearchers) {
+          if (!pastSearchers.contains(token)) {
+            pastSearchers.add(token);
+          }
+        }
+      }
+    }
+
+    return s;
   }
 
   @Override
   protected void releaseSearcher(IndexSearcher s) throws Exception {
-    mgr.release(s);
+    s.getIndexReader().decRef();
   }
 
   @Override
@@ -127,6 +171,7 @@ public class TestSearcherManager extends
       System.out.println("TEST: now close SearcherManager");
     }
     mgr.close();
+    lifetimeMGR.close();
   }
   
   public void testIntermediateClose() throws IOException, InterruptedException {