Thanks for the explanation. It makes sense that we start with a given
seed and then each iteration is different because it re-uses the same
Random instance (or whatever static state?) without re-initialization?

On Wed, Apr 3, 2024 at 6:09 PM Dawid Weiss <dawid.we...@gmail.com> wrote:
>
>
>> Now I just need to understand why the test failure is no longer reproducing 
>> lol.
>
>
> This is indeed the hard part!
>
>>
>> Also it's mildly confusing that when you specify tests.iters it prints a 
>> single test seed if it is actually going to use many different ones?
>
>
> It prints a single seed because it starts from that seed (the static 
> initialization, that is). But each test has its own starting point derived 
> from the main seed and the test name (if I recall right). So when you pass 
> tests.iters=100 and run a single test, any random call in that test 
> (excluding static hooks and static blocks) should be different on each 
> iteration. You can try it by adding:
>
> assumeTrue("", RandomizedTest.randomBoolean());
>
> For example (I added it to TestSearch.java):
>
> ./gradlew -p lucene/core test --tests TestSearch -Ptests.iters=100
> ...
> :lucene:core:test (SUCCESS): 100 test(s), 52 skipped
>
> if you modify this to assertTrue, you'll get to see the hierarchical seed 
> chain for each test that failed - note the first part is constant, the second 
> is derived for each test iteration:
>
> ./gradlew -p lucene/core test --tests TestSearch -Ptests.iters=100 
> -Ptests.seed=deadbeef
>
> and two example failures:
>
>   - org.apache.lucene.TestSearch.testSearch 
> {seed=[DEADBEEF:3EDB7869EFFD5034]} (:lucene:core)
>     Test output: 
> /Users/dweiss/work/lucene/lucene/core/build/test-results/test/outputs/OUTPUT-org.apache.lucene.TestSearch.txt
>     Reproduce with: gradlew :lucene:core:test --tests 
> "org.apache.lucene.TestSearch.testSearch {seed=[DEADBEEF:3EDB7869EFFD5034]}" 
> -Ptests.jvms=4 "-Ptests.jvmargs=-XX:TieredStopAtLevel=1 -XX:+UseParallelGC 
> -XX:ActiveProcessorCount=1" -Ptests.seed=deadbeef -Ptests.iters=100 
> -Ptests.gui=false -Ptests.file.encoding=UTF-8 -Ptests.vectorsize=512
>
>   - org.apache.lucene.TestSearch.testSearch 
> {seed=[DEADBEEF:F44F3D10E8B98D27]} (:lucene:core)
>     Test output: 
> /Users/dweiss/work/lucene/lucene/core/build/test-results/test/outputs/OUTPUT-org.apache.lucene.TestSearch.txt
>     Reproduce with: gradlew :lucene:core:test --tests 
> "org.apache.lucene.TestSearch.testSearch {seed=[DEADBEEF:F44F3D10E8B98D27]}" 
> -Ptests.jvms=4 "-Ptests.jvmargs=-XX:TieredStopAtLevel=1 -XX:+UseParallelGC 
> -XX:ActiveProcessorCount=1" -Ptests.seed=deadbeef -Ptests.iters=100 
> -Ptests.gui=false -Ptests.file.encoding=UTF-8 -Ptests.vectorsize=512
>
> If you'd like to repeat tests with *the same* starting seed for each test, 
> you need to pass the full chain, including the second part of the seed. For 
> example, this will fail 100 times (and not approximately 50% of the times):
>
> ./gradlew -p lucene/core test --tests TestSearch -Ptests.iters=100 
> -Ptests.seed=deadbeef:F44F3D10E8B98D27
>
> It may seem a bit complicated but it really isn't... I hope!  And for 99% of 
> tests, you'd probably rerun with the first part of the seed and it'd be 
> sufficient to locate the problem.
>
> The 'beast' task is a bit different because it physically re-launches the 
> test infrastructure so if you don't fix the initial seed, each started JVM 
> will have a different "starting" seed for static initializers and hooks. This 
> may matter for locale randomization, jvm issues or static initializers that 
> rely on randomness. But most isolated test methods should only rely on their 
> starting seed (not the "global starting seed").
>
> Dawid

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@lucene.apache.org
For additional commands, e-mail: dev-h...@lucene.apache.org

Reply via email to