Index: lucene/src/test/org/apache/lucene/index/TestAddIndexes.java =================================================================== --- lucene/src/test/org/apache/lucene/index/TestAddIndexes.java (revision 1133480) +++ lucene/src/test/org/apache/lucene/index/TestAddIndexes.java (working copy) @@ -18,6 +18,7 @@ */ import java.io.IOException; +import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; @@ -866,6 +867,8 @@ if (t instanceof AlreadyClosedException || t instanceof MergePolicy.MergeAbortedException || t instanceof NullPointerException) { report = !didClose; + } else if (t instanceof FileNotFoundException) { + report = !didClose; } else if (t instanceof IOException) { Throwable t2 = t.getCause(); if (t2 instanceof MergePolicy.MergeAbortedException) { Index: lucene/src/java/org/apache/lucene/index/IndexWriter.java =================================================================== --- lucene/src/java/org/apache/lucene/index/IndexWriter.java (revision 1133480) +++ lucene/src/java/org/apache/lucene/index/IndexWriter.java (working copy) @@ -1999,6 +1999,9 @@ // will always write to a new generation ("write // once"). segmentInfos.rollbackSegmentInfos(rollbackSegments); + if (infoStream != null ) { + message("rollback: infos=" + segString(segmentInfos)); + } docWriter.abort(); @@ -2439,6 +2442,8 @@ flush(false, true); String mergedName = newSegmentName(); + // TODO: somehow we should fix this merge so it's + // abortable so that IW.close(false) is able to stop it SegmentMerger merger = new SegmentMerger(directory, config.getTermIndexInterval(), mergedName, null, payloadProcessorProvider, globalFieldNumberMap.newFieldInfos(SegmentCodecsBuilder.create(codecs))); @@ -2456,6 +2461,11 @@ boolean useCompoundFile; synchronized(this) { // Guard segmentInfos + if (stopMerges) { + deleter.deleteNewFiles(info.files()); + return; + } + ensureOpen(); useCompoundFile = mergePolicy.useCompoundFile(segmentInfos, info); } @@ -2471,6 +2481,11 @@ // Register the new segment synchronized(this) { + if (stopMerges) { + deleter.deleteNewFiles(info.files()); + return; + } + ensureOpen(); segmentInfos.add(info); checkpoint(); } @@ -3076,6 +3091,7 @@ boolean success = false; final long t0 = System.currentTimeMillis(); + //System.out.println(Thread.currentThread().getName() + ": merge start: size=" + (merge.estimatedMergeBytes/1024./1024.) + " MB\n merge=" + merge.segString(directory) + "\n idx=" + segString()); try { try { @@ -3116,6 +3132,7 @@ if (infoStream != null && merge.info != null) { message("merge time " + (System.currentTimeMillis()-t0) + " msec for " + merge.info.docCount + " docs"); } + //System.out.println(Thread.currentThread().getName() + ": merge end"); } /** Hook that's called when the specified merge is complete. */ @@ -3734,6 +3751,8 @@ assert testPoint("midStartCommit"); + boolean pendingCommitSet = false; + try { // This call can take a long time -- 10s of seconds // or more. We do it without sync: @@ -3753,6 +3772,7 @@ toSync.prepareCommit(directory); pendingCommit = toSync; + pendingCommitSet = true; pendingCommitChangeCount = myChangeCount; } @@ -3770,7 +3790,7 @@ // double-write a segments_N file. segmentInfos.updateGeneration(toSync); - if (pendingCommit == null) { + if (!pendingCommitSet) { if (infoStream != null) { message("hit exception committing segments file"); }