RFR: 8318839: Update test thread factory to catch all exceptions
Leonid Mesnik
lmesnik at openjdk.org
Thu Oct 26 23:04:31 UTC 2023
On Wed, 25 Oct 2023 21:08:01 GMT, Leonid Mesnik <lmesnik at openjdk.org> wrote:
> The jtreg starts the main thread in a separate ThreadGroup and checks unhandled exceptions for this group. However, it doesn't catch all unhandled exceptions. There is a jtreg issue for this https://bugs.openjdk.org/browse/CODETOOLS-7903526.
> Catching such issues for virtual threads is important because they are not included in any groups. So this fix implements the handler for the test thread factory.
>
> A few tests start failing.
>
> The test
> serviceability/jvmti/HeapMonitor/MyPackage/HeapMonitorVMEventsTest.java
> has testcases for platform and virtual threads. So, there is there's no need to run it with the thread factory.
>
> The test
> java/lang/Thread/virtual/ThreadAPI.java
> tests UncaughtExceptionHandler and virtual threads. No need to run it with a thread factory.
>
> Test
> test/jdk/java/util/concurrent/tck/ThreadTest.java is updated to not check the default empty handler.
>
> Probably, we need some common approach about dealing with the UncaughtExceptionHandler in jtreg.
> Hello Leonid, looking at the changes in this PR, what's being proposed is that when jtreg launches tests through a virtual thread, then this wrapping code will set a JVM level UncaughtExceptionHandler by calling Thread.setDefaultUncaughtExceptionHandler(...). The implementation of this UncaughtExceptionHandler calls System.exit(1). Wouldn't that kill the test VM? I think that would then impact everything else including jtreg report generation and such for the test, isn't it?
The jtreg correctly reports such failures. It is expected that JVM might fail. The only difference is that the reason for failure is System.exit(1) and the exception.
> I had a look at https://bugs.openjdk.org/browse/JDK-8318839 but it doesn't have enough details to help understand what currently happens when a test launched through a virtual thread from jtreg throws an uncaught exception. How/what gets reported for that test execution?
The jtreg correctly catches and reports failures thrown by the main virtual thread. However, it ignores exceptions thrown by any other threads started by the test.
For platform threads, jtreg uses ThreafGroup (AgentVMThreadGroup or MainThreadGroup) to report failures in other threads. However, there is no way to use such an approach to catch exceptions for all test threads when virtual threads are used.
See for details:
https://github.com/openjdk/jtreg/blob/ef3865581bdfc55c6315a8538222fc3a91b2b872/src/share/classes/com/sun/javatest/regtest/agent/MainWrapper.java#L72
I have a PR to implement the global exception handling here:
https://github.com/openjdk/jtreg/pull/172
Now it is the only proposal and might take a long time to complete it. So the current fix helps us to find issues with the virtual thread test factory until jtreg is fixed.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/16369#issuecomment-1782021953
More information about the core-libs-dev
mailing list