mirror of https://github.com/apache/lucene.git
LUCENE-6766: fix parallel reader's detection of conflicting index sort
This commit is contained in:
parent
1e82c13184
commit
8361de87be
|
@ -210,7 +210,7 @@ public final class DocValues {
|
||||||
(expected.length == 1
|
(expected.length == 1
|
||||||
? "(expected=" + expected[0]
|
? "(expected=" + expected[0]
|
||||||
: "(expected one of " + Arrays.toString(expected)) + "). " +
|
: "(expected one of " + Arrays.toString(expected)) + "). " +
|
||||||
" Re-index with correct docvalues type.");
|
"Re-index with correct docvalues type.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -107,10 +107,11 @@ public class ParallelLeafReader extends LeafReader {
|
||||||
|
|
||||||
// build FieldInfos and fieldToReader map:
|
// build FieldInfos and fieldToReader map:
|
||||||
for (final LeafReader reader : this.parallelReaders) {
|
for (final LeafReader reader : this.parallelReaders) {
|
||||||
|
Sort leafIndexSort = reader.getIndexSort();
|
||||||
if (indexSort == null) {
|
if (indexSort == null) {
|
||||||
indexSort = reader.getIndexSort();
|
indexSort = leafIndexSort;
|
||||||
} else if (indexSort.equals(reader.getIndexSort()) == false) {
|
} else if (leafIndexSort != null && indexSort.equals(leafIndexSort) == false) {
|
||||||
throw new IllegalArgumentException("cannot combine LeafReaders that have different index sorts: saw both sort=" + indexSort + " and " + reader.getIndexSort());
|
throw new IllegalArgumentException("cannot combine LeafReaders that have different index sorts: saw both sort=" + indexSort + " and " + leafIndexSort);
|
||||||
}
|
}
|
||||||
|
|
||||||
final FieldInfos readerFieldInfos = reader.getFieldInfos();
|
final FieldInfos readerFieldInfos = reader.getFieldInfos();
|
||||||
|
|
|
@ -23,10 +23,11 @@ import java.util.Random;
|
||||||
import org.apache.lucene.analysis.MockAnalyzer;
|
import org.apache.lucene.analysis.MockAnalyzer;
|
||||||
import org.apache.lucene.document.Document;
|
import org.apache.lucene.document.Document;
|
||||||
import org.apache.lucene.document.Field;
|
import org.apache.lucene.document.Field;
|
||||||
import org.apache.lucene.search.BooleanClause.Occur;
|
|
||||||
import org.apache.lucene.search.*;
|
import org.apache.lucene.search.*;
|
||||||
|
import org.apache.lucene.search.BooleanClause.Occur;
|
||||||
import org.apache.lucene.store.AlreadyClosedException;
|
import org.apache.lucene.store.AlreadyClosedException;
|
||||||
import org.apache.lucene.store.Directory;
|
import org.apache.lucene.store.Directory;
|
||||||
|
import org.apache.lucene.util.IOUtils;
|
||||||
import org.apache.lucene.util.LuceneTestCase;
|
import org.apache.lucene.util.LuceneTestCase;
|
||||||
import org.apache.lucene.util.TestUtil;
|
import org.apache.lucene.util.TestUtil;
|
||||||
|
|
||||||
|
@ -314,4 +315,60 @@ public class TestParallelLeafReader extends LuceneTestCase {
|
||||||
return dir2;
|
return dir2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// not ok to have one leaf w/ index sort and another with a different index sort
|
||||||
|
public void testWithIndexSort1() throws Exception {
|
||||||
|
Directory dir1 = newDirectory();
|
||||||
|
IndexWriterConfig iwc1 = newIndexWriterConfig(new MockAnalyzer(random()));
|
||||||
|
iwc1.setIndexSort(new Sort(new SortField("foo", SortField.Type.INT)));
|
||||||
|
IndexWriter w1 = new IndexWriter(dir1, iwc1);
|
||||||
|
w1.addDocument(new Document());
|
||||||
|
w1.commit();
|
||||||
|
w1.addDocument(new Document());
|
||||||
|
w1.forceMerge(1);
|
||||||
|
w1.close();
|
||||||
|
IndexReader r1 = DirectoryReader.open(dir1);
|
||||||
|
|
||||||
|
Directory dir2 = newDirectory();
|
||||||
|
IndexWriterConfig iwc2 = newIndexWriterConfig(new MockAnalyzer(random()));
|
||||||
|
iwc2.setIndexSort(new Sort(new SortField("bar", SortField.Type.INT)));
|
||||||
|
IndexWriter w2 = new IndexWriter(dir2, iwc2);
|
||||||
|
w2.addDocument(new Document());
|
||||||
|
w2.commit();
|
||||||
|
w2.addDocument(new Document());
|
||||||
|
w2.forceMerge(1);
|
||||||
|
w2.close();
|
||||||
|
IndexReader r2 = DirectoryReader.open(dir2);
|
||||||
|
|
||||||
|
String message = expectThrows(IllegalArgumentException.class, () -> {
|
||||||
|
new ParallelLeafReader(getOnlyLeafReader(r1), getOnlyLeafReader(r2));
|
||||||
|
}).getMessage();
|
||||||
|
assertEquals("cannot combine LeafReaders that have different index sorts: saw both sort=<int: \"foo\"> and <int: \"bar\">", message);
|
||||||
|
IOUtils.close(r1, dir1, r2, dir2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ok to have one leaf w/ index sort and the other with no sort
|
||||||
|
public void testWithIndexSort2() throws Exception {
|
||||||
|
Directory dir1 = newDirectory();
|
||||||
|
IndexWriterConfig iwc1 = newIndexWriterConfig(new MockAnalyzer(random()));
|
||||||
|
iwc1.setIndexSort(new Sort(new SortField("foo", SortField.Type.INT)));
|
||||||
|
IndexWriter w1 = new IndexWriter(dir1, iwc1);
|
||||||
|
w1.addDocument(new Document());
|
||||||
|
w1.commit();
|
||||||
|
w1.addDocument(new Document());
|
||||||
|
w1.forceMerge(1);
|
||||||
|
w1.close();
|
||||||
|
IndexReader r1 = DirectoryReader.open(dir1);
|
||||||
|
|
||||||
|
Directory dir2 = newDirectory();
|
||||||
|
IndexWriterConfig iwc2 = newIndexWriterConfig(new MockAnalyzer(random()));
|
||||||
|
IndexWriter w2 = new IndexWriter(dir2, iwc2);
|
||||||
|
w2.addDocument(new Document());
|
||||||
|
w2.addDocument(new Document());
|
||||||
|
w2.close();
|
||||||
|
|
||||||
|
IndexReader r2 = DirectoryReader.open(dir2);
|
||||||
|
new ParallelLeafReader(false, getOnlyLeafReader(r1), getOnlyLeafReader(r2)).close();
|
||||||
|
new ParallelLeafReader(false, getOnlyLeafReader(r2), getOnlyLeafReader(r1)).close();
|
||||||
|
IOUtils.close(r1, dir1, r2, dir2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue