Index: src/test/org/apache/lucene/index/TestIndexWriter.java =================================================================== --- src/test/org/apache/lucene/index/TestIndexWriter.java (revision 620765) +++ src/test/org/apache/lucene/index/TestIndexWriter.java (working copy) @@ -2793,4 +2793,48 @@ reader.close(); dir.close(); } + + // Just intercepts all merges & verifies that we are never + // merging a segment with >= 20 (maxMergeDocs) docs + private class MyIndexWriter extends IndexWriter { + int mergeCount; + Directory myDir; + public MyIndexWriter(Directory dir) throws IOException { + super(dir, new StandardAnalyzer()); + myDir = dir; + } + synchronized MergePolicy.OneMerge getNextMerge() { + MergePolicy.OneMerge merge = super.getNextMerge(); + if (merge != null) + mergeCount++; + return merge; + } + } + + public void testOptimizeOverMerge() throws IOException { + Directory dir = new MockRAMDirectory(); + IndexWriter writer = new IndexWriter(dir, + false, new StandardAnalyzer()); + writer.setMaxBufferedDocs(2); + writer.setMergeFactor(100); + writer.setRAMBufferSizeMB(IndexWriter.DISABLE_AUTO_FLUSH); + + Document document = new Document(); + + document = new Document(); + Field storedField = new Field("stored", "stored", Field.Store.YES, + Field.Index.NO); + document.add(storedField); + Field termVectorField = new Field("termVector", "termVector", + Field.Store.NO, Field.Index.UN_TOKENIZED, + Field.TermVector.WITH_POSITIONS_OFFSETS); + document.add(termVectorField); + for(int i=0;i<170;i++) + writer.addDocument(document); + + writer.close(); + MyIndexWriter myWriter = new MyIndexWriter(dir); + myWriter.optimize(); + assertEquals(10, myWriter.mergeCount); + } } Index: src/java/org/apache/lucene/index/IndexWriter.java =================================================================== --- src/java/org/apache/lucene/index/IndexWriter.java (revision 620777) +++ src/java/org/apache/lucene/index/IndexWriter.java (working copy) @@ -3039,6 +3039,11 @@ docStoreOffset, docStoreSegment, docStoreIsCompoundFile); + // Also enroll the merged segment into mergingSegments; + // this prevents it from getting selected for a merge + // after our merge is done but while we are building the + // CFS: + mergingSegments.add(merge.info); } /** Does fininishing for a merge, which is fast but holds @@ -3054,6 +3059,7 @@ final int end = sourceSegments.size(); for(int i=0;i