1616 */
1717package org .apache .lucene .index ;
1818
19+ import java .util .concurrent .atomic .AtomicInteger ;
1920import org .apache .lucene .document .Document ;
2021import org .apache .lucene .document .Field ;
2122import org .apache .lucene .document .TextField ;
@@ -35,17 +36,25 @@ public class TestForTooMuchCloning extends LuceneTestCase {
3536 // during merging and searching:
3637 public void test () throws Exception {
3738 final MockDirectoryWrapper dir = newMockDirectory ();
39+ dir .setVerboseClone (false ); // set true to view clone stacks.
3840 final TieredMergePolicy tmp = new TieredMergePolicy ();
3941 tmp .setMaxMergeAtOnce (2 );
42+ AtomicInteger segmentsMerged = new AtomicInteger ();
4043 final RandomIndexWriter w =
4144 new RandomIndexWriter (
4245 random (),
4346 dir ,
4447 newIndexWriterConfig (new MockAnalyzer (random ()))
48+ // to reduce flakiness on merge clone count
49+ .setMergeScheduler (new SerialMergeScheduler ())
4550 .setMaxBufferedDocs (2 )
46- // use a FilterMP otherwise RIW will randomly reconfigure
47- // the MP while the test runs
48- .setMergePolicy (new FilterMergePolicy (tmp )));
51+ .setMergePolicy (
52+ new OneMergeWrappingMergePolicy (
53+ tmp ,
54+ oneMerge -> {
55+ segmentsMerged .addAndGet (oneMerge .segments .size ());
56+ return oneMerge ;
57+ })));
4958 final int numDocs = 20 ;
5059 for (int docs = 0 ; docs < numDocs ; docs ++) {
5160 StringBuilder sb = new StringBuilder ();
@@ -62,7 +71,7 @@ public void test() throws Exception {
6271 // System.out.println("merge clone count=" + cloneCount);
6372 assertTrue (
6473 "too many calls to IndexInput.clone during merging: " + dir .getInputCloneCount (),
65- dir .getInputCloneCount () < 500 );
74+ dir .getInputCloneCount () < ( r . leaves (). size () + segmentsMerged . get ()) * 50 );
6675
6776 final IndexSearcher s = newSearcher (r );
6877 // important: set this after newSearcher, it might have run checkindex
0 commit comments