Index: lucene/core/src/java/org/apache/lucene/index/IndexWriter.java =================================================================== --- lucene/core/src/java/org/apache/lucene/index/IndexWriter.java (revision 1364417) +++ lucene/core/src/java/org/apache/lucene/index/IndexWriter.java (working copy) @@ -842,7 +842,7 @@ if (hitOOM) { rollbackInternal(); } else { - closeInternal(waitForMerges, !hitOOM); + closeInternal(waitForMerges, true); } } } @@ -891,19 +891,46 @@ docWriter.abort(); // already closed } - if (waitForMerges) - // Give merge scheduler last chance to run, in case - // any pending merges are waiting: - mergeScheduler.merge(this); - + ThreadInterruptedException priorE = null; + if (waitForMerges) { + try { + // Give merge scheduler last chance to run, in case + // any pending merges are waiting: + mergeScheduler.merge(this); + } catch (ThreadInterruptedException tie) { + priorE = tie; + } + } + mergePolicy.close(); + boolean success = false; synchronized(this) { - finishMerges(waitForMerges); + while (!success) { + try { + finishMerges(waitForMerges); + success = true; + } catch (ThreadInterruptedException tie) { + // change to waitForMerges = false, so we just try + // to let the scheduler stop: + waitForMerges = false; + if (priorE == null) priorE = tie; + } + } stopMerges = true; } - mergeScheduler.close(); - + + success = false; + while (!success) { + try { + mergeScheduler.close(); + success = true; + } catch (ThreadInterruptedException tie) { + if (priorE == null) priorE = tie; + } + } + if (priorE != null) throw priorE; + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "now call final commit()"); }