Skip to content

Commit 6f01543

Browse files
lsh1215dweiss
andauthored
LUCENE-14611: Reduce memory pressure in TestTermInSetQuery.testDuel (#16300)
* LUCENE-14611: Reduce memory pressure in TestTermInSetQuery.testDuel * LUCENE-14611: Clarify TestTermInSetQuery match comparison * LUCENE-14611: Add CHANGES entry * LUCENE-14611: Use FixedBitSet equality for match comparison * LUCENE-14611: Reuse FixedBitSetCollector for match comparison --------- Co-authored-by: Dawid Weiss <dawid.weiss@carrotsearch.com>
1 parent 3afffee commit 6f01543

2 files changed

Lines changed: 27 additions & 6 deletions

File tree

lucene/CHANGES.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,9 @@ Optimizations
178178

179179
Bug Fixes
180180
---------------------
181+
* GITHUB#16300: Reduce memory pressure in TestTermInSetQuery.testDuel stress runs.
182+
(Sanghun Lee)
183+
181184
* GITHUB#14049: Randomize KNN codec params in RandomCodec. Fixes scalar quantization div-by-zero
182185
when all values are identical. (Mike Sokolov)
183186

lucene/core/src/test/org/apache/lucene/search/TestTermInSetQuery.java

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,14 @@
4747
import org.apache.lucene.search.BooleanClause.Occur;
4848
import org.apache.lucene.store.Directory;
4949
import org.apache.lucene.tests.index.RandomIndexWriter;
50+
import org.apache.lucene.tests.search.FixedBitSetCollector;
5051
import org.apache.lucene.tests.search.QueryUtils;
5152
import org.apache.lucene.tests.util.LuceneTestCase;
5253
import org.apache.lucene.tests.util.RamUsageTester;
5354
import org.apache.lucene.tests.util.TestUtil;
5455
import org.apache.lucene.util.BytesRef;
5556
import org.apache.lucene.util.BytesRefIterator;
57+
import org.apache.lucene.util.FixedBitSet;
5658
import org.apache.lucene.util.IOUtils;
5759
import org.apache.lucene.util.automaton.ByteRunnable;
5860

@@ -139,6 +141,9 @@ public void testDuel() throws IOException {
139141
iw.commit();
140142
final IndexReader reader = iw.getReader();
141143
final IndexSearcher searcher = newSearcher(reader);
144+
// This test checks query equivalence, not query-cache behavior. Keep the randomized
145+
// test-framework searcher, but avoid retaining cached doc-id sets across iterations.
146+
searcher.setQueryCache(null);
142147
iw.close();
143148

144149
if (reader.numDocs() == 0) {
@@ -284,17 +289,30 @@ public void testSkipperOptimizationGapAssumption() throws IOException {
284289
private void assertSameMatches(IndexSearcher searcher, Query q1, Query q2, boolean scores)
285290
throws IOException {
286291
final int maxDoc = searcher.getIndexReader().maxDoc();
287-
final TopDocs td1 = searcher.search(q1, maxDoc, scores ? Sort.RELEVANCE : Sort.INDEXORDER);
288-
final TopDocs td2 = searcher.search(q2, maxDoc, scores ? Sort.RELEVANCE : Sort.INDEXORDER);
289-
assertEquals(td1.totalHits.value(), td2.totalHits.value());
290-
for (int i = 0; i < td1.scoreDocs.length; ++i) {
291-
assertEquals(td1.scoreDocs[i].doc, td2.scoreDocs[i].doc);
292-
if (scores) {
292+
if (scores) {
293+
final TopDocs td1 = searcher.search(q1, maxDoc);
294+
final TopDocs td2 = searcher.search(q2, maxDoc);
295+
296+
assertEquals(td1.totalHits.value(), td2.totalHits.value());
297+
for (int i = 0; i < td1.scoreDocs.length; ++i) {
298+
assertEquals(td1.scoreDocs[i].doc, td2.scoreDocs[i].doc);
293299
assertEquals(td1.scoreDocs[i].score, td2.scoreDocs[i].score, 10e-7);
294300
}
301+
} else {
302+
// For no-score comparisons, only doc-id set equality matters. Avoid materializing
303+
// all hits as sorted TopDocs for every query pair.
304+
final FixedBitSet matches1 = collectMatches(searcher, q1, maxDoc);
305+
final FixedBitSet matches2 = collectMatches(searcher, q2, maxDoc);
306+
307+
assertEquals(matches1, matches2);
295308
}
296309
}
297310

311+
private static FixedBitSet collectMatches(IndexSearcher searcher, Query query, int maxDoc)
312+
throws IOException {
313+
return searcher.search(query, FixedBitSetCollector.createManager(maxDoc));
314+
}
315+
298316
public void testHashCodeAndEquals() {
299317
int num = atLeast(100);
300318
List<BytesRef> terms = new ArrayList<>();

0 commit comments

Comments
 (0)