uschindler commented on code in PR #15864:
URL: https://github.com/apache/lucene/pull/15864#discussion_r2979772231


##########
lucene/core/src/test/org/apache/lucene/internal/tests/TestTestSecrets.java:
##########
@@ -37,4 +46,70 @@ public void testCannotSet() {
     expectThrows(AssertionError.class, () -> 
TestSecrets.setIndexPackageAccess(null));
     expectThrows(AssertionError.class, () -> 
TestSecrets.setSegmentReaderAccess(null));
   }
+
+  public void testDeadlock() throws Exception {

Review Comment:
   I was able to beef-up that test. Works much better and tests the whole 
deadloding around IndexWriter. I will post a patch for the other test, or 
should I commit directly?
   
   ```
   TestCodecLoadingDeadlock > testDeadlock FAILED
       java.lang.AssertionError: Process died abnormally? expected:<0> but 
was:<1>
           at 
__randomizedtesting.SeedInfo.seed([A5DDBF322DCE93C1:A8B65E262B943E17]:0)
           at org.junit.Assert.fail(Assert.java:89)
           at org.junit.Assert.failNotEquals(Assert.java:835)
           at org.junit.Assert.assertEquals(Assert.java:647)
           at 
org.apache.lucene.codecs.TestCodecLoadingDeadlock.testDeadlock(TestCodecLoadingDeadlock.java:88)
           at 
java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
           at java.base/java.lang.reflect.Method.invoke(Method.java:565)
           at 
com.carrotsearch.randomizedtesting.RandomizedRunner.invoke(RandomizedRunner.java:1763)
           at 
com.carrotsearch.randomizedtesting.RandomizedRunner$8.evaluate(RandomizedRunner.java:946)
           at 
com.carrotsearch.randomizedtesting.rules.StatementAdapter.evaluate(StatementAdapter.java:36)
           at 
com.carrotsearch.randomizedtesting.ThreadLeakControl$StatementRunner.run(ThreadLeakControl.java:390)
           at 
com.carrotsearch.randomizedtesting.ThreadLeakControl.forkTimeoutingTask(ThreadLeakControl.java:843)
           at 
com.carrotsearch.randomizedtesting.ThreadLeakControl$3.evaluate(ThreadLeakControl.java:490)
           at 
com.carrotsearch.randomizedtesting.RandomizedRunner.runSingleTest(RandomizedRunner.java:955)
           at 
com.carrotsearch.randomizedtesting.RandomizedRunner$5.evaluate(RandomizedRunner.java:840)
           at 
com.carrotsearch.randomizedtesting.RandomizedRunner$6.evaluate(RandomizedRunner.java:891)
           at 
com.carrotsearch.randomizedtesting.RandomizedRunner$7.evaluate(RandomizedRunner.java:902)
           at 
com.carrotsearch.randomizedtesting.rules.StatementAdapter.evaluate(StatementAdapter.java:36)
           at 
com.carrotsearch.randomizedtesting.ThreadLeakControl$StatementRunner.run(ThreadLeakControl.java:390)
           at 
com.carrotsearch.randomizedtesting.ThreadLeakControl.forkTimeoutingTask(ThreadLeakControl.java:843)
           at 
com.carrotsearch.randomizedtesting.ThreadLeakControl$2.evaluate(ThreadLeakControl.java:426)
           at 
com.carrotsearch.randomizedtesting.RandomizedRunner.runSuite(RandomizedRunner.java:716)
           at 
com.carrotsearch.randomizedtesting.RandomizedRunner.access$200(RandomizedRunner.java:138)
           at 
com.carrotsearch.randomizedtesting.RandomizedRunner$2.run(RandomizedRunner.java:637)
   
   org.apache.lucene.codecs.TestCodecLoadingDeadlock > test suite's output 
saved to C:\Users\Uwe 
Schindler\Projects\lucene\lucene\lucene\core\build\test-results\test_1\outputs\OUTPUT-org.apache.lucene.codecs.TestCodecLoadingDeadlock.txt,
 copied below:
     2> März 24, 2026 9:10:47 AM 
org.apache.lucene.internal.vectorization.VectorizationProvider lookup
     2> WARNUNG: Vector bitsize enforcement; using default vectorization 
provider outside of testMode
     1> codec: FastDecompressionCompressingStoredFieldsData, pf: MockRandom, 
dvf: Lucene90
     1> Subprocess emitted the following output:
     1> M´┐¢rz 24, 2026 9:10:48 AM 
org.apache.lucene.internal.vectorization.VectorizationProvider lookup
     1> WARNUNG: Java vector incubator module is not readable. For optimal 
vector performance, pass '--add-modules jdk.incubator.vector' to enable Vector 
API.
     1> Pool didn't return after 30 seconds, classloader deadlock? Dumping 
stack traces.
     1> # Thread: Thread[#26,deadlockchecker-1-thread-1,5,], state: TERMINATED, 
stack:
     1>
     1>
     1> # Thread: Thread[#27,deadlockchecker-1-thread-2,5,], state: TERMINATED, 
stack:
     1>
     1>
     1> # Thread: Thread[#28,deadlockchecker-1-thread-3,5,], state: TERMINATED, 
stack:
     1>
     1>
     1> # Thread: Thread[#29,deadlockchecker-1-thread-4,5,], state: TERMINATED, 
stack:
     1>
     1>
     1> # Thread: Thread[#30,deadlockchecker-1-thread-5,5,], state: TERMINATED, 
stack:
     1>
     1>
     1> # Thread: Thread[#31,deadlockchecker-1-thread-6,5,], state: TERMINATED, 
stack:
     1>
     1>
     1> # Thread: Thread[#32,deadlockchecker-1-thread-7,5,], state: TERMINATED, 
stack:
     1>
     1>
     1> # Thread: Thread[#33,deadlockchecker-1-thread-8,5,main], state: 
RUNNABLE, stack:
     1>    org.apache.lucene.index.IndexWriter.<clinit>(IndexWriter.java:6575)  
   java.base/jdk.internal.misc.Unsafe.ensureClassInitialized0(Native Method)    
   java.base/jdk.internal.misc.Unsafe.ensureClassInitialized(Unsafe.java:1169)  
   
java.base/java.lang.invoke.MethodHandles$Lookup.ensureInitialized(MethodHandles.java:2748)
      
org.apache.lucene.codecs.TestCodecLoadingDeadlock.lambda$main$1(TestCodecLoadingDeadlock.java:157)
      
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
       
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
       java.base/java.lang.Thread.run(Thread.java:1474)
     1>
     1> # Thread: Thread[#34,deadlockchecker-1-thread-9,5,main], state: 
RUNNABLE, stack:
     1>    java.base/jdk.internal.misc.Unsafe.ensureClassInitialized0(Native 
Method)       
java.base/jdk.internal.misc.Unsafe.ensureClassInitialized(Unsafe.java:1169)     
java.base/java.lang.invoke.MethodHandles$Lookup.ensureInitialized(MethodHandles.java:2748)
      
org.apache.lucene.codecs.TestCodecLoadingDeadlock.lambda$main$1(TestCodecLoadingDeadlock.java:160)
      
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
       
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
       java.base/java.lang.Thread.run(Thread.java:1474)
     1>
     1> # Thread: Thread[#35,deadlockchecker-1-thread-10,5,], state: 
TERMINATED, stack:
     1>
     1>
     1> # Thread: Thread[#36,deadlockchecker-1-thread-11,5,], state: 
TERMINATED, stack:
     1>
     1>
     1> # Thread: Thread[#37,deadlockchecker-1-thread-12,5,], state: 
TERMINATED, stack:
     1>
     1>
     1> # Thread: Thread[#38,deadlockchecker-1-thread-13,5,], state: 
TERMINATED, stack:
     1>
     1>
     1> # Thread: Thread[#39,deadlockchecker-1-thread-14,5,], state: 
TERMINATED, stack:
     1>
     1>
     1> # Thread: Thread[#40,deadlockchecker-1-thread-15,5,], state: 
TERMINATED, stack:
     1>
     1>
     1> # Thread: Thread[#41,deadlockchecker-1-thread-16,5,], state: 
TERMINATED, stack:
     1>
     1>
     1> # Thread: Thread[#42,deadlockchecker-1-thread-17,5,main], state: 
RUNNABLE, stack:
     1>    java.base/jdk.internal.misc.Unsafe.ensureClassInitialized0(Native 
Method)       
java.base/jdk.internal.misc.Unsafe.ensureClassInitialized(Unsafe.java:1169)     
java.base/java.lang.invoke.MethodHandles$Lookup.ensureInitialized(MethodHandles.java:2748)
      
org.apache.lucene.codecs.TestCodecLoadingDeadlock.lambda$main$1(TestCodecLoadingDeadlock.java:157)
      
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
       
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
       java.base/java.lang.Thread.run(Thread.java:1474)
     1>
     1> # Thread: Thread[#43,deadlockchecker-1-thread-18,5,main], state: 
RUNNABLE, stack:
     1>    java.base/java.lang.Class.forName0(Native Method)       
java.base/java.lang.Class.forName(Class.java:467)       
java.base/java.lang.Class.forName(Class.java:458)       
org.apache.lucene.internal.tests.TestSecrets.lambda$static$0(TestSecrets.java:43)
       
org.apache.lucene.internal.tests.TestSecrets.<clinit>(TestSecrets.java:51)      
org.apache.lucene.index.SegmentReader.<clinit>(SegmentReader.java:402)  
java.base/jdk.internal.misc.Unsafe.ensureClassInitialized0(Native Method)       
java.base/jdk.internal.misc.Unsafe.ensureClassInitialized(Unsafe.java:1169)     
java.base/java.lang.invoke.MethodHandles$Lookup.ensureInitialized(MethodHandles.java:2748)
      
org.apache.lucene.codecs.TestCodecLoadingDeadlock.lambda$main$1(TestCodecLoadingDeadlock.java:160)
      
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
       
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
       java.base/java.lang.Thread.
 run(Thread.java:1474)
     1>
      >     java.lang.AssertionError: Process died abnormally? expected:<0> but 
was:<1>
      >         at 
__randomizedtesting.SeedInfo.seed([A5DDBF322DCE93C1:A8B65E262B943E17]:0)
      >         at org.junit.Assert.fail(Assert.java:89)
      >         at org.junit.Assert.failNotEquals(Assert.java:835)
      >         at org.junit.Assert.assertEquals(Assert.java:647)
      >         at 
org.apache.lucene.codecs.TestCodecLoadingDeadlock.testDeadlock(TestCodecLoadingDeadlock.java:88)
      >         at 
java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
      >         at java.base/java.lang.reflect.Method.invoke(Method.java:565)
      >         at 
com.carrotsearch.randomizedtesting.RandomizedRunner.invoke(RandomizedRunner.java:1763)
      >         at 
com.carrotsearch.randomizedtesting.RandomizedRunner$8.evaluate(RandomizedRunner.java:946)
      >         at 
com.carrotsearch.randomizedtesting.rules.StatementAdapter.evaluate(StatementAdapter.java:36)
      >         at 
com.carrotsearch.randomizedtesting.ThreadLeakControl$StatementRunner.run(ThreadLeakControl.java:390)
      >         at 
com.carrotsearch.randomizedtesting.ThreadLeakControl.forkTimeoutingTask(ThreadLeakControl.java:843)
      >         at 
com.carrotsearch.randomizedtesting.ThreadLeakControl$3.evaluate(ThreadLeakControl.java:490)
      >         at 
com.carrotsearch.randomizedtesting.RandomizedRunner.runSingleTest(RandomizedRunner.java:955)
      >         at 
com.carrotsearch.randomizedtesting.RandomizedRunner$5.evaluate(RandomizedRunner.java:840)
      >         at 
com.carrotsearch.randomizedtesting.RandomizedRunner$6.evaluate(RandomizedRunner.java:891)
      >         at 
com.carrotsearch.randomizedtesting.RandomizedRunner$7.evaluate(RandomizedRunner.java:902)
      >         at 
com.carrotsearch.randomizedtesting.rules.StatementAdapter.evaluate(StatementAdapter.java:36)
      >         at 
com.carrotsearch.randomizedtesting.ThreadLeakControl$StatementRunner.run(ThreadLeakControl.java:390)
      >         at 
com.carrotsearch.randomizedtesting.ThreadLeakControl.forkTimeoutingTask(ThreadLeakControl.java:843)
      >         at 
com.carrotsearch.randomizedtesting.ThreadLeakControl$2.evaluate(ThreadLeakControl.java:426)
      >         at 
com.carrotsearch.randomizedtesting.RandomizedRunner.runSuite(RandomizedRunner.java:716)
      >         at 
com.carrotsearch.randomizedtesting.RandomizedRunner.access$200(RandomizedRunner.java:138)
      >         at 
com.carrotsearch.randomizedtesting.RandomizedRunner$2.run(RandomizedRunner.java:637)
   
   :lucene:core:test_1 (FAILURE): 1 test, 1  failure
   
   1 test completed, 1 failed
   
   > Task :lucene:core:test_1 FAILED
   ```
   
   Patch:
   
   ```diff
   diff --git 
a/lucene/core/src/test/org/apache/lucene/codecs/TestCodecLoadingDeadlock.java 
b/lucene/core/src/test/org/apache/lucene/codecs/TestCodecLoadingDeadlock.java
   index 0e0c3941bec..3705c8e6d58 100644
   --- 
a/lucene/core/src/test/org/apache/lucene/codecs/TestCodecLoadingDeadlock.java
   +++ 
b/lucene/core/src/test/org/apache/lucene/codecs/TestCodecLoadingDeadlock.java
   @@ -20,6 +20,8 @@ import com.carrotsearch.randomizedtesting.LifecycleScope;
    import com.carrotsearch.randomizedtesting.RandomizedContext;
    import com.carrotsearch.randomizedtesting.RandomizedRunner;
    import com.carrotsearch.randomizedtesting.RandomizedTest;
   +
   +import java.lang.invoke.MethodHandles;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
   @@ -36,6 +38,10 @@ import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;
    import java.util.stream.Collectors;
    import java.util.stream.IntStream;
   +
   +import org.apache.lucene.index.IndexWriter;
   +import org.apache.lucene.index.SegmentReader;
   +import org.apache.lucene.internal.tests.TestSecrets;
    import org.apache.lucene.tests.util.LuceneTestCase;
    import org.apache.lucene.util.NamedThreadFactory;
    import org.apache.lucene.util.SuppressForbidden;
   @@ -99,7 +105,8 @@ public class TestCodecLoadingDeadlock extends Assert {
        final String pfName = args[1];
        final String dvfName = args[2];
    
   -    final int numThreads = 14; // two times the modulo in switch statement 
below
   +    final int numTasks = 9; // add number of catch cases in switch below
   +    final int numThreads = numTasks * 2; // two times the modulo in switch 
statement below
        final CopyOnWriteArrayList<Thread> allThreads = new 
CopyOnWriteArrayList<>();
        final ExecutorService pool =
            Executors.newFixedThreadPool(
   @@ -114,6 +121,7 @@ public class TestCodecLoadingDeadlock extends Assert {
                });
    
        final CyclicBarrier barrier = new CyclicBarrier(numThreads);
   +    final var lookup = MethodHandles.lookup();
        IntStream.range(0, numThreads)
            .forEach(
                taskNo ->
   @@ -123,7 +131,7 @@ public class TestCodecLoadingDeadlock extends Assert {
                            // Await a common barrier point for all threads and 
then
                            // run racy code. This is intentional.
                            barrier.await();
   -                        switch (taskNo % 7) {
   +                        switch (taskNo % numTasks) {
                              case 0:
                                Codec.getDefault();
                                break;
   @@ -145,6 +153,12 @@ public class TestCodecLoadingDeadlock extends Assert {
                              case 6:
                                DocValuesFormat.availableDocValuesFormats();
                                break;
   +                          case 7:
   +                            lookup.ensureInitialized(IndexWriter.class);
   +                            break;
   +                          case 8:
   +                            lookup.ensureInitialized(SegmentReader.class);
   +                            break;
                              default:
                                throw new AssertionError();
                            }
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to