### CI Link

https://gradle-enterprise.elastic.co/s/n6mmfb3uwtq7q

### Repro line

./gradlew ':server:test' --tests "org.elasticsearch.search.internal.ContextIndexSearcherTests.testIntersectScorerAndRoleBits" \   -Dtests.seed=E99DBC08AEFDABC1 \   -Dtests.locale=und \   -Dtests.timezone=America/Santarem \   -Druntime.java=20

### Does it reproduce?

Yes

### Applicable branches

main

### Failure history

_No response_

### Failure excerpt

10:13:31 org.elasticsearch.search.internal.ContextIndexSearcherTests > testIntersectScorerAndRoleBits FAILED
10:13:31     java.lang.AssertionError: The top-reader used to create Weight is not the same as the current reader's top-reader (org.apache.lucene.index.CompositeReaderContext@4afc5040
10:13:31         at __randomizedtesting.SeedInfo.seed([E99DBC08AEFDABC1:41ACDD81C7F3BEAA]:0)
10:13:31         at org.apache.lucene.search.TermQuery$TermWeight.scorer(TermQuery.java:105)
10:13:31         at org.apache.lucene.search.Weight.scorerSupplier(Weight.java:136)
10:13:31         at org.apache.lucene.search.LRUQueryCache$CachingWrapperWeight.scorerSupplier(LRUQueryCache.java:759)
10:13:31         at org.apache.lucene.tests.search.AssertingWeight.scorerSupplier(AssertingWeight.java:80)
10:13:31         at org.apache.lucene.search.ConstantScoreQuery$1.scorerSupplier(ConstantScoreQuery.java:153)
10:13:31         at org.apache.lucene.tests.search.AssertingWeight.scorerSupplier(AssertingWeight.java:80)
10:13:31         at org.apache.lucene.tests.search.AssertingWeight.scorer(AssertingWeight.java:66)
10:13:31         at org.elasticsearch.search.internal.ContextIndexSearcherTests.testIntersectScorerAndRoleBits(ContextIndexSearcherTests.java:157)

server/src/test/java/org/elasticsearch/search/internal/ContextIndexSearcherTests.java
}
        void stopBusyThreads() {
            busyThreadsLatch.countDown();
        }
        @Override
        public void execute(Runnable command) {
            int started = startedTasks.incrementAndGet();
            if (started > executor.getMaximumPoolSize()) {
                try {
                    /*
                    There could be tasks that complete quickly before the exception is handled, which leaves room for new tasks that are
                    about to get cancelled to start before their cancellation becomes effective. We can accept that cancellation may or may
                    not be effective for the slices that belong to the first batch of tasks until all threads are busy and adjust the
                    test expectations accordingly, but for the subsequent slices, we want to assert that they are cancelled and never
                    executed. The only way to guarantee that is waiting for cancellation to kick in.
                    */
                    assertBusy(() -> {
                        Future<?> future = (Future<?>) command;
                        if (future.isCancelled() == false) {
                            throw new AssertionError("task should be cancelled");
                        }
                    });
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
            executor.execute(command);
        }
    }
    private static class TestQuery extends Query {