From 553f75ca9b9ae6e344fb6e7b7924979d8638385a Mon Sep 17 00:00:00 2001 From: Benjamin Trent Date: Tue, 29 Aug 2023 08:55:57 -0400 Subject: [PATCH] Ensure that searcher.getReader() is used when using Lucene test searcher (#98932) Related to: https://github.com/elastic/elasticsearch/pull/98110 Lucene test searcher will randomly wrap the passed reader. That means any usages that mix the two (the searcher and the previously reader), could cause tests to fail. Some of these locations maybe don't strictly need the searcher.getReader, but I just wanted to make sure we didn't have flaky tests. closes: https://github.com/elastic/elasticsearch/issues/98925 --- .../action/termvectors/TermVectorsUnitTests.java | 4 ++-- .../org/elasticsearch/common/lucene/LuceneTests.java | 5 +++-- .../deps/lucene/VectorHighlighterTests.java | 11 ++++++----- .../index/query/functionscore/FunctionScoreTests.java | 2 +- .../index/search/nested/NestedSortingTests.java | 6 +++--- .../index/shard/ShardSplittingQueryTests.java | 2 +- .../search/internal/ContextIndexSearcherTests.java | 2 +- 7 files changed, 17 insertions(+), 15 deletions(-) diff --git a/server/src/test/java/org/elasticsearch/action/termvectors/TermVectorsUnitTests.java b/server/src/test/java/org/elasticsearch/action/termvectors/TermVectorsUnitTests.java index a06895e701ed3..a8f748d0c3129 100644 --- a/server/src/test/java/org/elasticsearch/action/termvectors/TermVectorsUnitTests.java +++ b/server/src/test/java/org/elasticsearch/action/termvectors/TermVectorsUnitTests.java @@ -109,7 +109,7 @@ private void writeEmptyTermVector(TermVectorsResponse outResponse) throws IOExce TopDocs search = s.search(new TermQuery(new Term("id", "abc")), 1); ScoreDoc[] scoreDocs = search.scoreDocs; int doc = scoreDocs[0].doc; - Fields fields = dr.getTermVectors(doc); + Fields fields = s.getIndexReader().termVectors().get(doc); EnumSet flags = EnumSet.of(Flag.Positions, Flag.Offsets); outResponse.setFields(fields, null, flags, fields); outResponse.setExists(true); @@ -144,7 +144,7 @@ private void writeStandardTermVector(TermVectorsResponse outResponse) throws IOE TopDocs search = s.search(new TermQuery(new Term("id", "abc")), 1); ScoreDoc[] scoreDocs = search.scoreDocs; int doc = scoreDocs[0].doc; - Fields termVectors = dr.getTermVectors(doc); + Fields termVectors = s.getIndexReader().termVectors().get(doc); EnumSet flags = EnumSet.of(Flag.Positions, Flag.Offsets); outResponse.setFields(termVectors, null, flags, termVectors); dr.close(); diff --git a/server/src/test/java/org/elasticsearch/common/lucene/LuceneTests.java b/server/src/test/java/org/elasticsearch/common/lucene/LuceneTests.java index fd7d7f04cbcd6..02084c818346b 100644 --- a/server/src/test/java/org/elasticsearch/common/lucene/LuceneTests.java +++ b/server/src/test/java/org/elasticsearch/common/lucene/LuceneTests.java @@ -439,8 +439,9 @@ public void testAsSequentialBitsUsesRandomAccess() throws IOException { w.addDocument(doc); } w.forceMerge(1); - try (IndexReader reader = DirectoryReader.open(w)) { - IndexSearcher searcher = newSearcher(reader); + try (IndexReader indexReader = DirectoryReader.open(w)) { + IndexSearcher searcher = newSearcher(indexReader); + IndexReader reader = searcher.getIndexReader(); searcher.setQueryCache(null); Query query = new IndexOrDocValuesQuery(new UnsupportedQuery(), NumericDocValuesField.newSlowRangeQuery("foo", 3L, 5L)); Weight weight = searcher.createWeight(query, ScoreMode.COMPLETE_NO_SCORES, 1f); diff --git a/server/src/test/java/org/elasticsearch/deps/lucene/VectorHighlighterTests.java b/server/src/test/java/org/elasticsearch/deps/lucene/VectorHighlighterTests.java index c9350a3ec4dea..34681d858cf67 100644 --- a/server/src/test/java/org/elasticsearch/deps/lucene/VectorHighlighterTests.java +++ b/server/src/test/java/org/elasticsearch/deps/lucene/VectorHighlighterTests.java @@ -57,7 +57,7 @@ public void testVectorHighlighter() throws Exception { FastVectorHighlighter highlighter = new FastVectorHighlighter(); String fragment = highlighter.getBestFragment( highlighter.getFieldQuery(new TermQuery(new Term("content", "bad"))), - reader, + searcher.getIndexReader(), topDocs.scoreDocs[0].doc, "content", 30 @@ -79,8 +79,9 @@ public void testVectorHighlighterPrefixQuery() throws Exception { document.add(new Field("content", "the big bad dog", vectorsType)); indexWriter.addDocument(document); - IndexReader reader = DirectoryReader.open(indexWriter); - IndexSearcher searcher = newSearcher(reader); + IndexReader indexReader = DirectoryReader.open(indexWriter); + IndexSearcher searcher = newSearcher(indexReader); + IndexReader reader = searcher.getIndexReader(); TopDocs topDocs = searcher.search(new TermQuery(new Term("_id", "1")), 1); assertThat(topDocs.totalHits.value, equalTo(1L)); @@ -143,7 +144,7 @@ public void testVectorHighlighterNoStore() throws Exception { FastVectorHighlighter highlighter = new FastVectorHighlighter(); String fragment = highlighter.getBestFragment( highlighter.getFieldQuery(new TermQuery(new Term("content", "bad"))), - reader, + searcher.getIndexReader(), topDocs.scoreDocs[0].doc, "content", 30 @@ -169,7 +170,7 @@ public void testVectorHighlighterNoTermVector() throws Exception { FastVectorHighlighter highlighter = new FastVectorHighlighter(); String fragment = highlighter.getBestFragment( highlighter.getFieldQuery(new TermQuery(new Term("content", "bad"))), - reader, + searcher.getIndexReader(), topDocs.scoreDocs[0].doc, "content", 30 diff --git a/server/src/test/java/org/elasticsearch/index/query/functionscore/FunctionScoreTests.java b/server/src/test/java/org/elasticsearch/index/query/functionscore/FunctionScoreTests.java index ffda772b1a152..20d5fdae5e4cf 100644 --- a/server/src/test/java/org/elasticsearch/index/query/functionscore/FunctionScoreTests.java +++ b/server/src/test/java/org/elasticsearch/index/query/functionscore/FunctionScoreTests.java @@ -697,7 +697,7 @@ public void testPropagatesApproximations() throws IOException { FunctionScoreQuery fsq = new FunctionScoreQuery(query, null, Float.POSITIVE_INFINITY); for (org.apache.lucene.search.ScoreMode scoreMode : org.apache.lucene.search.ScoreMode.values()) { Weight weight = searcher.createWeight(fsq, scoreMode, 1f); - Scorer scorer = weight.scorer(reader.leaves().get(0)); + Scorer scorer = weight.scorer(searcher.getIndexReader().leaves().get(0)); assertNotNull(scorer.twoPhaseIterator()); } } diff --git a/server/src/test/java/org/elasticsearch/index/search/nested/NestedSortingTests.java b/server/src/test/java/org/elasticsearch/index/search/nested/NestedSortingTests.java index 653b00c15b313..97e58a4a16f23 100644 --- a/server/src/test/java/org/elasticsearch/index/search/nested/NestedSortingTests.java +++ b/server/src/test/java/org/elasticsearch/index/search/nested/NestedSortingTests.java @@ -99,7 +99,7 @@ public void testDuel() throws Exception { MultiValueMode sortMode = randomFrom(Arrays.asList(MultiValueMode.MIN, MultiValueMode.MAX)); DirectoryReader reader = DirectoryReader.open(writer); reader = ElasticsearchDirectoryReader.wrap(reader, new ShardId(indexService.index(), 0)); - IndexSearcher searcher = newSearcher(reader); + IndexSearcher searcher = newSearcher(reader, false); PagedBytesIndexFieldData indexFieldData1 = getForField("f"); IndexFieldData indexFieldData2 = NoOrdinalsStringFieldDataTests.hideOrdinals(indexFieldData1); final String missingValue = randomBoolean() ? null : TestUtil.randomSimpleString(random(), 2); @@ -291,7 +291,7 @@ public void testNestedSorting() throws Exception { MultiValueMode sortMode = MultiValueMode.MIN; DirectoryReader reader = DirectoryReader.open(writer); reader = ElasticsearchDirectoryReader.wrap(reader, new ShardId(indexService.index(), 0)); - IndexSearcher searcher = newSearcher(reader); + IndexSearcher searcher = newSearcher(reader, false); PagedBytesIndexFieldData indexFieldData = getForField("field2"); Query parentFilter = new TermQuery(new Term("_nested_path", "parent")); Query childFilter = Queries.not(parentFilter); @@ -612,7 +612,7 @@ public void testMultiLevelNestedSorting() throws IOException { } DirectoryReader reader = DirectoryReader.open(writer); reader = ElasticsearchDirectoryReader.wrap(reader, new ShardId(indexService.index(), 0)); - IndexSearcher searcher = newSearcher(reader); + IndexSearcher searcher = newSearcher(reader, false); SearchExecutionContext searchExecutionContext = indexService.newSearchExecutionContext(0, 0, searcher, () -> 0L, null, emptyMap()); FieldSortBuilder sortBuilder = new FieldSortBuilder("chapters.paragraphs.word_count"); diff --git a/server/src/test/java/org/elasticsearch/index/shard/ShardSplittingQueryTests.java b/server/src/test/java/org/elasticsearch/index/shard/ShardSplittingQueryTests.java index ad3b6d46a6f51..851ad18500add 100644 --- a/server/src/test/java/org/elasticsearch/index/shard/ShardSplittingQueryTests.java +++ b/server/src/test/java/org/elasticsearch/index/shard/ShardSplittingQueryTests.java @@ -155,7 +155,7 @@ void assertSplit(Directory dir, IndexMetadata metadata, int targetShardId, boole ScoreMode.COMPLETE_NO_SCORES, 1f ); - final List leaves = reader.leaves(); + final List leaves = searcher.getIndexReader().leaves(); for (final LeafReaderContext ctx : leaves) { Scorer scorer = splitWeight.scorer(ctx); DocIdSetIterator iterator = scorer.iterator(); diff --git a/server/src/test/java/org/elasticsearch/search/internal/ContextIndexSearcherTests.java b/server/src/test/java/org/elasticsearch/search/internal/ContextIndexSearcherTests.java index 676d62ce73b49..01a60cc5060e9 100644 --- a/server/src/test/java/org/elasticsearch/search/internal/ContextIndexSearcherTests.java +++ b/server/src/test/java/org/elasticsearch/search/internal/ContextIndexSearcherTests.java @@ -137,7 +137,7 @@ public void testIntersectScorerAndRoleBits() throws Exception { 1f ); - LeafReaderContext leaf = directoryReader.leaves().get(0); + LeafReaderContext leaf = searcher.getIndexReader().leaves().get(0); CombinedBitSet bitSet = new CombinedBitSet(query(leaf, "field1", "value1"), leaf.reader().getLiveDocs()); LeafCollector leafCollector = new LeafBucketCollector() {