Index: lucene/CHANGES.txt =================================================================== --- lucene/CHANGES.txt (revision 1086202) +++ lucene/CHANGES.txt (working copy) @@ -14,6 +14,12 @@ * LUCENE-2990: ArrayUtil/CollectionUtil.*Sort() methods now exit early on empty or one-element lists/arrays. (Uwe Schindler) +Bug fixes + +* LUCENE-2996: addIndexes(IndexReader) did not flush before adding the new + indexes, causing existing deletions to be applied on the incoming indexes as + well. (Shai Erera) + ======================= Lucene 3.1 (not yet released) ======================= Changes in backwards compatibility policy Index: lucene/src/test/org/apache/lucene/index/TestAddIndexes.java =================================================================== --- lucene/src/test/org/apache/lucene/index/TestAddIndexes.java (revision 1086202) +++ lucene/src/test/org/apache/lucene/index/TestAddIndexes.java (working copy) @@ -911,5 +911,39 @@ assertEquals("Only one compound segment should exist", 3, dir.listAll().length); } + + // LUCENE-2996: tests that addIndexes(IndexReader) applies existing deletes correctly. + public void testExistingDeletes() throws Exception { + Directory[] dirs = new Directory[2]; + for (int i = 0; i < dirs.length; i++) { + dirs[i] = newDirectory(); + IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer()); + IndexWriter writer = new IndexWriter(dirs[i], conf); + Document doc = new Document(); + doc.add(new Field("id", "myid", Store.NO, Index.NOT_ANALYZED_NO_NORMS)); + writer.addDocument(doc); + writer.close(); + } + + IndexWriterConfig conf = new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer()); + IndexWriter writer = new IndexWriter(dirs[0], conf); + + // Now delete the document + writer.deleteDocuments(new Term("id", "myid")); + IndexReader r = IndexReader.open(dirs[1]); + try { + writer.addIndexes(r); + } finally { + r.close(); + } + writer.commit(); + assertEquals("Documents from the incoming index should not have been deleted", 1, writer.numDocs()); + writer.close(); + + for (Directory dir : dirs) { + dir.close(); + } + + } } Index: lucene/src/java/org/apache/lucene/index/IndexWriter.java =================================================================== --- lucene/src/java/org/apache/lucene/index/IndexWriter.java (revision 1086202) +++ lucene/src/java/org/apache/lucene/index/IndexWriter.java (working copy) @@ -2913,6 +2913,10 @@ ensureOpen(); try { + if (infoStream != null) + message("flush at addIndexes(IndexReader...)"); + flush(false, true); + String mergedName = newSegmentName(); SegmentMerger merger = new SegmentMerger(directory, config.getTermIndexInterval(), mergedName, null, payloadProcessorProvider,