LUCENE-8243: fix IndexWriter.addIndexes(Directory[]) to properly preserve index file names for updated doc values fields

This commit is contained in:
Mike McCandless 2018-04-08 11:14:51 -04:00
parent bd8fe72426
commit 99364584ff
3 changed files with 91 additions and 3 deletions

View File

@ -129,6 +129,10 @@ Bug Fixes
* LUCENE-8236: Filter duplicated points when creating GeoPath shapes to * LUCENE-8236: Filter duplicated points when creating GeoPath shapes to
avoid creation of bogus planes. (Ignacio Vera) avoid creation of bogus planes. (Ignacio Vera)
* LUCENE-8243: IndexWriter.addIndexes(Directory[]) did not properly preserve
index file names for updated doc values fields (Simon Willnauer,
Michael McCandless)
Other Other
* LUCENE-8228: removed obsolete IndexDeletionPolicy clone() requirements from * LUCENE-8228: removed obsolete IndexDeletionPolicy clone() requirements from

View File

@ -3207,8 +3207,10 @@ public class IndexWriter implements Closeable, TwoPhaseCommit, Accountable {
info.info.getDiagnostics(), info.info.getId(), info.info.getAttributes(), info.info.getIndexSort()); info.info.getDiagnostics(), info.info.getId(), info.info.getAttributes(), info.info.getIndexSort());
SegmentCommitInfo newInfoPerCommit = new SegmentCommitInfo(newInfo, info.getDelCount(), info.getDelGen(), SegmentCommitInfo newInfoPerCommit = new SegmentCommitInfo(newInfo, info.getDelCount(), info.getDelGen(),
info.getFieldInfosGen(), info.getDocValuesGen()); info.getFieldInfosGen(), info.getDocValuesGen());
newInfo.setFiles(info.files()); newInfo.setFiles(info.info.files());
newInfoPerCommit.setFieldInfosFiles(info.getFieldInfosFiles());
newInfoPerCommit.setDocValuesUpdatesFiles(info.getDocValuesUpdatesFiles());
boolean success = false; boolean success = false;
@ -3228,7 +3230,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit, Accountable {
} }
} }
assert copiedFiles.equals(newInfoPerCommit.files()); assert copiedFiles.equals(newInfoPerCommit.files()): "copiedFiles=" + copiedFiles + " vs " + newInfoPerCommit.files();
return newInfoPerCommit; return newInfoPerCommit;
} }
@ -3569,6 +3571,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit, Accountable {
return seqNo; return seqNo;
} }
@SuppressWarnings("try")
private final void finishCommit() throws IOException { private final void finishCommit() throws IOException {
boolean commitCompleted = false; boolean commitCompleted = false;

View File

@ -1332,4 +1332,85 @@ public class TestAddIndexes extends LuceneTestCase {
assertEquals("cannot change index sort from <int: \"foo\"> to <string: \"foo\">", message); assertEquals("cannot change index sort from <int: \"foo\"> to <string: \"foo\">", message);
IOUtils.close(r1, dir1, w2, dir2); IOUtils.close(r1, dir1, w2, dir2);
} }
public void testAddIndexesDVUpdateSameSegmentName() throws Exception {
Directory dir1 = newDirectory();
IndexWriterConfig iwc1 = newIndexWriterConfig(new MockAnalyzer(random()));
IndexWriter w1 = new IndexWriter(dir1, iwc1);
Document doc = new Document();
doc.add(new StringField("id", "1", Field.Store.YES));
doc.add(new StringField("version", "1", Field.Store.YES));
doc.add(new NumericDocValuesField("soft_delete", 1));
w1.addDocument(doc);
w1.flush();
w1.updateDocValues(new Term("id", "1"), new NumericDocValuesField("soft_delete", 1));
w1.commit();
w1.close();
IndexWriterConfig iwc2 = newIndexWriterConfig(new MockAnalyzer(random()));
Directory dir2 = newDirectory();
IndexWriter w2 = new IndexWriter(dir2, iwc2);
w2.addIndexes(dir1);
w2.commit();
w2.close();
if (VERBOSE) {
System.out.println("\nTEST: now open w3");
}
IndexWriterConfig iwc3 = newIndexWriterConfig(new MockAnalyzer(random()));
if (VERBOSE) {
iwc3.setInfoStream(System.out);
}
IndexWriter w3 = new IndexWriter(dir2, iwc3);
w3.close();
iwc3 = newIndexWriterConfig(new MockAnalyzer(random()));
w3 = new IndexWriter(dir2, iwc3);
w3.close();
dir1.close();
dir2.close();
}
public void testAddIndexesDVUpdateNewSegmentName() throws Exception {
Directory dir1 = newDirectory();
IndexWriterConfig iwc1 = newIndexWriterConfig(new MockAnalyzer(random()));
IndexWriter w1 = new IndexWriter(dir1, iwc1);
Document doc = new Document();
doc.add(new StringField("id", "1", Field.Store.YES));
doc.add(new StringField("version", "1", Field.Store.YES));
doc.add(new NumericDocValuesField("soft_delete", 1));
w1.addDocument(doc);
w1.flush();
w1.updateDocValues(new Term("id", "1"), new NumericDocValuesField("soft_delete", 1));
w1.commit();
w1.close();
IndexWriterConfig iwc2 = newIndexWriterConfig(new MockAnalyzer(random()));
Directory dir2 = newDirectory();
IndexWriter w2 = new IndexWriter(dir2, iwc2);
w2.addDocument(new Document());
w2.commit();
w2.addIndexes(dir1);
w2.commit();
w2.close();
if (VERBOSE) {
System.out.println("\nTEST: now open w3");
}
IndexWriterConfig iwc3 = newIndexWriterConfig(new MockAnalyzer(random()));
if (VERBOSE) {
iwc3.setInfoStream(System.out);
}
IndexWriter w3 = new IndexWriter(dir2, iwc3);
w3.close();
iwc3 = newIndexWriterConfig(new MockAnalyzer(random()));
w3 = new IndexWriter(dir2, iwc3);
w3.close();
dir1.close();
dir2.close();
}
} }