Index: CHANGES.txt =================================================================== --- CHANGES.txt (revision 891896) +++ CHANGES.txt (working copy) @@ -136,6 +136,8 @@ * LUCENE-2155: Fix time and zone dependent localization test failures in queryparser tests. (Uwe Schindler, Chris Male, Robert Muir) +* LUCENE-2170: Fix thread starvation problems. (Uwe Schindler) + ======================= Release 3.0.0 2009-11-25 ======================= Changes in backwards compatibility policy Index: src/test/org/apache/lucene/index/TestAtomicUpdate.java =================================================================== --- src/test/org/apache/lucene/index/TestAtomicUpdate.java (revision 891896) +++ src/test/org/apache/lucene/index/TestAtomicUpdate.java (working copy) @@ -45,7 +45,7 @@ } private static abstract class TimedThread extends Thread { - boolean failed; + volatile boolean failed; int count; private static float RUN_TIME_SEC = 0.5f; private TimedThread[] allThreads; @@ -63,10 +63,11 @@ count = 0; try { - while(System.currentTimeMillis() < stopTime && !anyErrors()) { + do { + if (anyErrors()) break; doWork(); count++; - } + } while(System.currentTimeMillis() < stopTime); } catch (Throwable e) { System.out.println(Thread.currentThread().getName() + ": exc"); e.printStackTrace(System.out); Index: src/test/org/apache/lucene/index/TestIndexWriter.java =================================================================== --- src/test/org/apache/lucene/index/TestIndexWriter.java (revision 891896) +++ src/test/org/apache/lucene/index/TestIndexWriter.java (working copy) @@ -2206,7 +2206,7 @@ int fullCount = 0; final long stopTime = System.currentTimeMillis() + 200; - while(System.currentTimeMillis() < stopTime) { + do { try { writer.updateDocument(new Term("id", ""+(idUpto++)), doc); addCount++; @@ -2240,7 +2240,7 @@ } break; } - } + } while(System.currentTimeMillis() < stopTime); } } @@ -4640,7 +4640,8 @@ Field f = new Field("f", "", Field.Store.NO, Field.Index.NOT_ANALYZED); doc.add(f); int count = 0; - while(System.currentTimeMillis() < endTime && !failed.get()) { + do { + if (failed.get()) break; for(int j=0;j<10;j++) { final String s = finalI + "_" + String.valueOf(count++); f.setValue(s); @@ -4652,7 +4653,7 @@ r = r2; assertEquals("term=f:" + s, 1, r.docFreq(new Term("f", s))); } - } + } while(System.currentTimeMillis() < endTime); r.close(); } catch (Throwable t) { failed.set(true); Index: src/test/org/apache/lucene/index/TestIndexWriterExceptions.java =================================================================== --- src/test/org/apache/lucene/index/TestIndexWriterExceptions.java (revision 891896) +++ src/test/org/apache/lucene/index/TestIndexWriterExceptions.java (working copy) @@ -65,7 +65,7 @@ final long stopTime = System.currentTimeMillis() + 500; - while(System.currentTimeMillis() < stopTime) { + do { doFail.set(this); final String id = ""+r.nextInt(50); idField.setValue(id); @@ -105,7 +105,7 @@ failure = t; break; } - } + } while(System.currentTimeMillis() < stopTime); } } Index: src/test/org/apache/lucene/index/TestIndexWriterReader.java =================================================================== --- src/test/org/apache/lucene/index/TestIndexWriterReader.java (revision 891896) +++ src/test/org/apache/lucene/index/TestIndexWriterReader.java (working copy) @@ -730,14 +730,14 @@ threads[i] = new Thread() { @Override public void run() { - while(System.currentTimeMillis() < endTime) { + do { try { writer.addIndexesNoOptimize(dirs); } catch (Throwable t) { excs.add(t); throw new RuntimeException(t); } - } + } while(System.currentTimeMillis() < endTime); } }; threads[i].setDaemon(true); @@ -760,6 +760,15 @@ for(int i=0;i= lastCount); assertEquals(0, excs.size()); writer.close(); @@ -796,7 +805,7 @@ public void run() { int count = 0; final Random r = new Random(); - while(System.currentTimeMillis() < endTime) { + do { try { for(int i=0;i<10;i++) { writer.addDocument(createDocument(10*count+i, "test", 4)); @@ -811,7 +820,7 @@ excs.add(t); throw new RuntimeException(t); } - } + } while(System.currentTimeMillis() < endTime); } }; threads[i].setDaemon(true); @@ -832,8 +841,17 @@ for(int i=0;i 0); + // at least search once + IndexReader r2 = r.reopen(); + if (r2 != r) { + r.close(); + r = r2; + } + Query q = new TermQuery(new Term("indexname", "test")); + sum += new IndexSearcher(r).search(q, 10).totalHits; + assertTrue("no documents found at all", sum > 0); + assertEquals(0, excs.size()); writer.close(); Index: src/test/org/apache/lucene/index/TestStressIndexing.java =================================================================== --- src/test/org/apache/lucene/index/TestStressIndexing.java (revision 891896) +++ src/test/org/apache/lucene/index/TestStressIndexing.java (working copy) @@ -30,7 +30,7 @@ private Random RANDOM; private static abstract class TimedThread extends Thread { - boolean failed; + volatile boolean failed; int count; private static int RUN_TIME_SEC = 1; private TimedThread[] allThreads; @@ -48,10 +48,11 @@ count = 0; try { - while(System.currentTimeMillis() < stopTime && !anyErrors()) { + do { + if (anyErrors()) break; doWork(); count++; - } + } while(System.currentTimeMillis() < stopTime); } catch (Throwable e) { System.out.println(Thread.currentThread() + ": exc"); e.printStackTrace(System.out); Index: src/test/org/apache/lucene/index/TestTransactions.java =================================================================== --- src/test/org/apache/lucene/index/TestTransactions.java (revision 891896) +++ src/test/org/apache/lucene/index/TestTransactions.java (working copy) @@ -38,7 +38,7 @@ } private static abstract class TimedThread extends Thread { - boolean failed; + volatile boolean failed; private static float RUN_TIME_SEC = 0.5f; private TimedThread[] allThreads; @@ -53,8 +53,10 @@ final long stopTime = System.currentTimeMillis() + (long) (1000*RUN_TIME_SEC); try { - while(System.currentTimeMillis() < stopTime && !anyErrors()) + do { + if (anyErrors()) break; doWork(); + } while (System.currentTimeMillis() < stopTime); } catch (Throwable e) { System.out.println(Thread.currentThread() + ": exc"); e.printStackTrace(System.out); Index: src/test/org/apache/lucene/TestSnapshotDeletionPolicy.java =================================================================== --- src/test/org/apache/lucene/TestSnapshotDeletionPolicy.java (revision 891896) +++ src/test/org/apache/lucene/TestSnapshotDeletionPolicy.java (working copy) @@ -121,7 +121,7 @@ public void run() { Document doc = new Document(); doc.add(new Field("content", "aaa", Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS)); - while(System.currentTimeMillis() < stopTime) { + do { for(int i=0;i<27;i++) { try { writer.addDocument(doc); @@ -142,7 +142,7 @@ } catch (InterruptedException ie) { throw new ThreadInterruptedException(ie); } - } + } while(System.currentTimeMillis() < stopTime); } }; @@ -150,12 +150,10 @@ // While the above indexing thread is running, take many // backups: - while(System.currentTimeMillis() < stopTime) { + do { backupIndex(dir, dp); Thread.sleep(20); - if (!t.isAlive()) - break; - } + } while(t.isAlive()); t.join();