Index: lucene/src/test/org/apache/lucene/search/function/FunctionTestSetup.java =================================================================== --- lucene/src/test/org/apache/lucene/search/function/FunctionTestSetup.java (revision 1050725) +++ lucene/src/test/org/apache/lucene/search/function/FunctionTestSetup.java (working copy) @@ -93,6 +93,9 @@ @Before public void setUp() throws Exception { super.setUp(); + if (VERBOSE) { + System.out.println("TEST: setUp"); + } // prepare a small index with just a few documents. dir = newDirectory(); anlzr = new MockAnalyzer(); @@ -101,6 +104,7 @@ iwc.setMaxBufferedDocs(_TestUtil.nextInt(random, 2, 7)); } RandomIndexWriter iw = new RandomIndexWriter(random, dir, iwc); + iw.w.setInfoStream(VERBOSE ? System.out : null); // add docs not exactly in natural ID order, to verify we do check the order of docs by scores int remaining = N_DOCS; boolean done[] = new boolean[N_DOCS]; @@ -115,9 +119,15 @@ remaining --; } if (!doMultiSegment) { + if (VERBOSE) { + System.out.println("TEST: setUp optimize"); + } iw.optimize(); } iw.close(); + if (VERBOSE) { + System.out.println("TEST: setUp done close"); + } } private void addDoc(RandomIndexWriter iw, int i) throws Exception { Index: lucene/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java =================================================================== --- lucene/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java (revision 1050725) +++ lucene/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java (working copy) @@ -65,7 +65,6 @@ protected Directory dir; - private boolean closed; protected IndexWriter writer; protected int mergeThreadCount; @@ -147,18 +146,37 @@ * pause & unpause threads. */ protected synchronized void updateMergeThreads() { - CollectionUtil.mergeSort(mergeThreads, compareByMergeDocCount); + // Only look at threads that are alive & not in the + // process of stopping (ie have an active merge): + final List activeMerges = new ArrayList(); + + int threadIdx = 0; + while (threadIdx < mergeThreads.size()) { + final MergeThread mergeThread = mergeThreads.get(threadIdx); + if (!mergeThread.isAlive()) { + // Prune any dead threads + mergeThreads.remove(threadIdx); + continue; + } + if (mergeThread.getCurrentMerge() != null) { + activeMerges.add(mergeThread); + } + threadIdx++; + } + + CollectionUtil.mergeSort(activeMerges, compareByMergeDocCount); - final int count = mergeThreads.size(); int pri = mergeThreadPriority; - for(int i=0;i 0) { - if (verbose()) - message("now wait for threads; currently " + mergeThreads.size() + " still running"); - final int count = mergeThreads.size(); - if (verbose()) { - for(int i=0;i