RFR: 8371502: serviceability/jvmti/vthread/ThreadListStackTracesTest/ThreadListStackTracesTest.java failing

Serguei Spitsyn sspitsyn at openjdk.org
Wed Dec 10 06:20:23 UTC 2025


On Wed, 10 Dec 2025 06:00:47 GMT, Serguei Spitsyn <sspitsyn at openjdk.org> wrote:

> This fixes the test which is unreliable and fails intermittently from time to time.
> The test was failing in the method `checkReentrantLock()` when comparing the expected state with result from `vt.getState()`. The issue is that the call to `ThreadListStackTracesTest.reentrantLock.lock()` in a `ReentrantLockTestTask` can reach waiting state on some class loading but not on the ReentrantLock. Please see the first comment for test sources details.
> The fix is to add a big enough sleep before call to the checkStates().
> 
> Testing:
>  - submitted about thousands of mach5 runs of the `ThreadListStackTracesTest` test runs before and after the fix
>  - TBD: submit mach5 tiers 1-3 to be completely safe

The most relevant test fragments are below:


    private static void checkReentrantLock() throws InterruptedException {
        final Thread.State expState = Thread.State.WAITING;
        reentrantLock.lock();
        String name = "ReentrantLockTestTask";
        TestTask task = new ReentrantLockTestTask();
        Thread vt = Thread.ofVirtual().name(name).start(task);
        task.ensureReady(vt, expState);
        checkStates(vt, expState); <== intermittently fails inside this call !!!
    } 

   private static void checkStates(Thread vt, Thread.State expState) {
        int singleState = getStateSingle(vt);
        int multiState = getStateMultiple(vt, Thread.currentThread());
        int jvmtiExpState = (expState == Thread.State.WAITING) ?
                            JVMTI_THREAD_STATE_WAITING :
                            JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER;

        System.out.printf("State: expected: %s single: %x multi: %x\n",
                          vt.getState(), singleState, multiState); <== printed state values !!!

        if (vt.getState() != expState) {         <== this comparison failed!!!
            failed("Java thread state is wrong");    <== Exception is thrown here!!!
        }
        . . .

class ReentrantLockTestTask extends TestTask {
    public void run() {
        log("grabbing reentrantLock");
        threadReady = true;
        ThreadListStackTracesTest.reentrantLock.lock(); <== May have waiting state in some class loading!
        log("grabbed reentrantLock");
    }
}

-------------

PR Comment: https://git.openjdk.org/jdk/pull/28734#issuecomment-3635563778


More information about the serviceability-dev mailing list