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 {