blob: e309d6803207912409c138825c7c2c24735abcaf [file] [log] [blame]
Index: lucene/CHANGES.txt
===================================================================
--- lucene/CHANGES.txt (revision 950226)
+++ lucene/CHANGES.txt (working copy)
@@ -455,6 +455,11 @@
* LUCENE-2424: Fix FieldDoc.toString to not just fallback to
super.toString() (Stephen Green via Mike McCandless)
+* LUCENE-2311: Always pass a "fully loaded" (terms index & doc stores)
+ SegmentsReader to IndexWriter's mergedSegmentWarmer (if set), so
+ that warming is free to do whatever it needs to. (Earwin Burrfoot
+ via Mike McCandless)
+
New features
* LUCENE-2128: Parallelized fetching document frequencies during weight
Index: lucene/src/test/org/apache/lucene/index/TestIndexWriterReader.java
===================================================================
--- lucene/src/test/org/apache/lucene/index/TestIndexWriterReader.java (revision 950226)
+++ lucene/src/test/org/apache/lucene/index/TestIndexWriterReader.java (working copy)
@@ -32,6 +32,7 @@
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
+import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.MockRAMDirectory;
import org.apache.lucene.store.AlreadyClosedException;
@@ -840,4 +841,25 @@
w.close();
}
+ public void testSegmentWarmer() throws Exception {
+ Directory dir = new MockRAMDirectory();
+ IndexWriter w = new IndexWriter(dir, new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer())
+ .setMaxBufferedDocs(2).setReaderPooling(true));
+ w.setMergedSegmentWarmer(new IndexWriter.IndexReaderWarmer() {
+ public void warm(IndexReader r) throws IOException {
+ final IndexSearcher s = new IndexSearcher(r);
+ final TopDocs hits = s.search(new TermQuery(new Term("foo", "bar")), 10);
+ assertEquals(20, hits.totalHits);
+ }
+ });
+
+ Document doc = new Document();
+ doc.add(new Field("foo", "bar", Field.Store.YES, Field.Index.NOT_ANALYZED));
+ for(int i=0;i<20;i++) {
+ w.addDocument(doc);
+ }
+ w.waitForMerges();
+ w.close();
+ dir.close();
+ }
}
Index: lucene/src/test/org/apache/lucene/util/LuceneTestCase.java
===================================================================
--- lucene/src/test/org/apache/lucene/util/LuceneTestCase.java (revision 950226)
+++ lucene/src/test/org/apache/lucene/util/LuceneTestCase.java (working copy)
@@ -129,7 +129,18 @@
@Override
protected void tearDown() throws Exception {
BooleanQuery.setMaxClauseCount(savedBoolMaxClauseCount);
+
try {
+ Thread.setDefaultUncaughtExceptionHandler(savedUncaughtExceptionHandler);
+ if (!uncaughtExceptions.isEmpty()) {
+ System.err.println("The following exceptions were thrown by threads:");
+ for (UncaughtExceptionEntry entry : uncaughtExceptions) {
+ System.err.println("*** Thread: " + entry.thread.getName() + " ***");
+ entry.exception.printStackTrace(System.err);
+ }
+ fail("Some threads threw uncaught exceptions!");
+ }
+
// this isn't as useful as calling directly from the scope where the
// index readers are used, because they could be gc'ed just before
// tearDown is called.
@@ -145,17 +156,7 @@
} finally {
purgeFieldCache(FieldCache.DEFAULT);
}
-
- Thread.setDefaultUncaughtExceptionHandler(savedUncaughtExceptionHandler);
- if (!uncaughtExceptions.isEmpty()) {
- System.err.println("The following exceptions were thrown by threads:");
- for (UncaughtExceptionEntry entry : uncaughtExceptions) {
- System.err.println("*** Thread: " + entry.thread.getName() + " ***");
- entry.exception.printStackTrace(System.err);
- }
- fail("Some threads throwed uncaught exceptions!");
- }
-
+
super.tearDown();
}
Index: lucene/src/java/org/apache/lucene/index/IndexWriter.java
===================================================================
--- lucene/src/java/org/apache/lucene/index/IndexWriter.java (revision 950226)
+++ lucene/src/java/org/apache/lucene/index/IndexWriter.java (working copy)
@@ -4033,7 +4033,21 @@
// keep deletes (it's costly to open entire reader
// when we just need deletes)
- final SegmentReader mergedReader = readerPool.get(merge.info, false, BufferedIndexInput.BUFFER_SIZE, -1);
+ final int termsIndexDivisor;
+ final boolean loadDocStores;
+
+ if (poolReaders && mergedSegmentWarmer != null) {
+ // Load terms index & doc stores so the segment
+ // warmer can run searches, load documents/term
+ // vectors
+ termsIndexDivisor = 1;
+ loadDocStores = true;
+ } else {
+ termsIndexDivisor = -1;
+ loadDocStores = false;
+ }
+
+ final SegmentReader mergedReader = readerPool.get(merge.info, loadDocStores, BufferedIndexInput.BUFFER_SIZE, termsIndexDivisor);
try {
if (poolReaders && mergedSegmentWarmer != null) {
mergedSegmentWarmer.warm(mergedReader);