On Tue, 29 Aug 2023 10:09:21 GMT, Serguei Spitsyn <sspit...@openjdk.org> wrote:

> This update fixes two important issues:
>  - Issue reported by a bug submitter about missing JVMTI events on virtual 
> threads after an a JVMTI agent dynamic attach
>  -  Known scalability/performance issue: a need to lazily create 
> `JvmtiThreadState's` for virtual threads
> 
> The issue is tricky to fix because the existing mechanism of the JVMTI event 
> management does not support unmounted virtual threads. The JVMTI 
> `SetEventNotificationMode()` calls the function 
> `JvmtiEventControllerPrivate::recompute_enabled()`
> which inspects a `JavaThread's` list and for each thread in the list 
> recomputes enabled event bits with the function 
> `JvmtiEventControllerPrivate::recompute_thread_enabled()`.  The 
> `JvmtiThreadState` of each thread is created but only when it is really 
> needed, eg, if any of the thread filtered events is enabled. There was an 
> initial adjustment of this mechanism for virtual threads which accounted for 
> both carrier and virtual threads when a virtual thread is mounted. However, 
> it does not work for unmounted virtual threads. A temporary work around was 
> to always create `JvmtiThreadState` for each virtual thread eagerly at a 
> thread starting point.
> 
> This fix introduces new function `JvmtiExport::get_jvmti_thread_state()` 
> which checks if thread is virtual and there is a thread filtered event 
> enabled globally, and if so, forces a creation of the `JvmtiThreadState`. 
> Another adjustment was needed because the function `state_for_while_locked()` 
> can be called directly in some contexts. New function 
> `JvmtiEventController::recompute_thread_filtered()` was introduced to make 
> necessary corrections.
> 
> Testing:
>  - new test from the bug report was adopted: 
> `test/hotspot/jtreg/serviceability/jvmti/vthread/VThreadEventTest`
>  - ran mach5 tiers 1-6: all are passed

test/hotspot/jtreg/serviceability/jvmti/vthread/VThreadEventTest/VThreadEventTest.java
 line 91:

> 89: 
> 90:         try (ExecutorService executorService = 
> Executors.newVirtualThreadPerTaskExecutor()) {
> 91:             for (int tCnt = 0; tCnt < TCNT1; tCnt++) {

Could you please add a comment before each test group creation block about 
expected state

test/hotspot/jtreg/serviceability/jvmti/vthread/VThreadEventTest/VThreadEventTest.java
 line 100:

> 98:                     mready.await();
> 99:                     try {
> 100:                         // timeout is big enough to keep mounted untill 
> interrupted

The comment is misleading. 1st group of threads are expected to be unmounted 
during attach and mounted after the threads are interrupted.

test/hotspot/jtreg/serviceability/jvmti/vthread/VThreadEventTest/VThreadEventTest.java
 line 136:

> 134:             ready1.await();
> 135:             mready.decr();
> 136:             VirtualMachine vm = 
> VirtualMachine.attach(String.valueOf(ProcessHandle.current().pid()));

I think sleep is needed here so threads which should be unmounted have time to 
unmount before attach.

test/hotspot/jtreg/serviceability/jvmti/vthread/VThreadEventTest/VThreadEventTest.java
 line 141:

> 139:             log("main: completedNo: " + completedNo);
> 140:             attached = true;
> 141:             for (Thread t : threads) {

AFAIU threads in 3rd group (TCNT3) should be unmounted (with  
LockSupport.parkNanos) before they are interrupted.
Then we need sleep here

test/hotspot/jtreg/serviceability/jvmti/vthread/VThreadEventTest/VThreadEventTest.java
 line 149:

> 147:         for (int sleepNo = 0; sleepNo < 10 && threadEndCount() < 
> THREAD_CNT; sleepNo++) {
> 148:             log("main: wait iter: " + sleepNo);
> 149:             Thread.sleep(100);

sleep(1000)? (comment before the loop tells about 10 secs)

test/hotspot/jtreg/serviceability/jvmti/vthread/VThreadEventTest/libVThreadEventTest.cpp
 line 37:

> 35: 
> 36: namespace {
> 37:   std::mutex lock;

This mutex is only to make access to counters atomic.
It would be clearer to make counters std::atomic<int> and remove the mutex

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

PR Review Comment: https://git.openjdk.org/jdk/pull/15467#discussion_r1317795256
PR Review Comment: https://git.openjdk.org/jdk/pull/15467#discussion_r1317794334
PR Review Comment: https://git.openjdk.org/jdk/pull/15467#discussion_r1317796891
PR Review Comment: https://git.openjdk.org/jdk/pull/15467#discussion_r1317811234
PR Review Comment: https://git.openjdk.org/jdk/pull/15467#discussion_r1317804389
PR Review Comment: https://git.openjdk.org/jdk/pull/15467#discussion_r1317802305

Reply via email to