fix multi-thread test for LUCENE-997 (search timeout).

git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@627298 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Doron Cohen 2008-02-13 07:50:42 +00:00
parent ec18d3ad7c
commit 4b8b5ce1d7
1 changed files with 39 additions and 15 deletions

View File

@ -36,8 +36,15 @@ import java.util.BitSet;
* and (3) a sanity test with multiple searching threads. * and (3) a sanity test with multiple searching threads.
*/ */
public class TestTimeLimitedCollector extends LuceneTestCase { public class TestTimeLimitedCollector extends LuceneTestCase {
private static final int SLOW_DOWN = 10; private static final int SLOW_DOWN = 47;
private static final int N_DOCS = 2000; private static final int TIME_ALLOWED = 17 * SLOW_DOWN; // so searches can find about 17 docs.
// max time allowed is relaxed for multithreading tests.
// the multithread case fails when setting this to 1 (no slack) and launching many threads (>2000).
// but this is not a real failure, just noise.
private static final double MULTI_THREAD_SLACK = 3;
private static final int N_DOCS = 3000;
private static final int N_THREADS = 50; private static final int N_THREADS = 50;
private Searcher searcher; private Searcher searcher;
@ -76,6 +83,9 @@ public class TestTimeLimitedCollector extends LuceneTestCase {
} }
QueryParser queryParser = new QueryParser(FIELD_NAME, new StandardAnalyzer()); QueryParser queryParser = new QueryParser(FIELD_NAME, new StandardAnalyzer());
query = queryParser.parse(qtxt); query = queryParser.parse(qtxt);
// warm the searcher
searcher.search(query);
} }
@ -128,8 +138,7 @@ public class TestTimeLimitedCollector extends LuceneTestCase {
private void doTestTimeout(boolean multiThreaded) { private void doTestTimeout(boolean multiThreaded) {
MyHitCollector myHc = new MyHitCollector(); MyHitCollector myHc = new MyHitCollector();
myHc.setSlowDown(SLOW_DOWN); myHc.setSlowDown(SLOW_DOWN);
long timeAllowed = timeAllowed(multiThreaded); HitCollector tlCollector = new TimeLimitedCollector(myHc, TIME_ALLOWED);
HitCollector tlCollector = new TimeLimitedCollector(myHc, timeAllowed);
TimeLimitedCollector.TimeExceededException exception = null; TimeLimitedCollector.TimeExceededException exception = null;
try { try {
@ -142,19 +151,34 @@ public class TestTimeLimitedCollector extends LuceneTestCase {
assertNotNull( "Timeout expected!", exception ); assertNotNull( "Timeout expected!", exception );
assertTrue( "no hits found!", myHc.hitCount() > 0 ); assertTrue( "no hits found!", myHc.hitCount() > 0 );
assertTrue( "last doc collected cannot be 0!", exception.getLastDocCollected() > 0 ); assertTrue( "last doc collected cannot be 0!", exception.getLastDocCollected() > 0 );
assertEquals( exception.getTimeAllowed(), timeAllowed); assertEquals( exception.getTimeAllowed(), TIME_ALLOWED);
assertTrue ( "elapsed="+exception.getTimeElapsed()+" <= (allowed-resolution)="+(timeAllowed-TimeLimitedCollector.getResolution()), assertTrue ( "elapsed="+exception.getTimeElapsed()+" <= (allowed-resolution)="+(TIME_ALLOWED-TimeLimitedCollector.getResolution()),
exception.getTimeElapsed() > timeAllowed-TimeLimitedCollector.getResolution()); exception.getTimeElapsed() > TIME_ALLOWED-TimeLimitedCollector.getResolution());
assertTrue ( "lastDoc="+exception.getLastDocCollected()+" ,&& elapsed="+exception.getTimeElapsed()+ assertTrue ( "lastDoc="+exception.getLastDocCollected()+
" >= (allowed+resolution+slowdown)="+(timeAllowed+TimeLimitedCollector.getResolution()+SLOW_DOWN), " ,&& allowed="+exception.getTimeAllowed() +
exception.getTimeElapsed() < timeAllowed+TimeLimitedCollector.getResolution()+SLOW_DOWN); " ,&& elapsed="+exception.getTimeElapsed() +
" >= " + maxTimeStr(multiThreaded),
exception.getTimeElapsed() < maxTime(multiThreaded));
} }
private long timeAllowed(boolean multiThreaded) { private long maxTime(boolean multiThreaded) {
if (!multiThreaded) { long res = 2 * TimeLimitedCollector.getResolution() + TIME_ALLOWED + SLOW_DOWN; // some slack for less noise in this test
return 2 * TimeLimitedCollector.getResolution() + SLOW_DOWN; // be on the safe side with this test if (multiThreaded) {
res *= MULTI_THREAD_SLACK; // larger slack
} }
return 3 * (TimeLimitedCollector.getResolution() + SLOW_DOWN); // even safer (avoid noise in tests) return res;
}
private String maxTimeStr(boolean multiThreaded) {
String s =
"( " +
"2*resolution + TIME_ALLOWED + SLOW_DOWN = " +
"2*" + TimeLimitedCollector.getResolution() + " + " + TIME_ALLOWED + " + " + SLOW_DOWN +
")";
if (multiThreaded) {
s = MULTI_THREAD_SLACK + " * "+s;
}
return maxTime(multiThreaded) + " = " + s;
} }
/** /**
@ -226,7 +250,7 @@ public class TestTimeLimitedCollector extends LuceneTestCase {
if (interrupted) { if (interrupted) {
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
} }
assertEquals(N_THREADS,success.cardinality()); assertEquals("some threads failed!", N_THREADS,success.cardinality());
} }
// counting hit collector that can slow down at collect(). // counting hit collector that can slow down at collect().