RFR(XS): 8234882: JVM TI StopThread should only allow ThreadDeath
serguei.spitsyn at oracle.com
serguei.spitsyn at oracle.com
Fri May 29 08:24:13 UTC 2020
On 5/29/20 00:56, serguei.spitsyn at oracle.com wrote:
> On 5/29/20 00:42, serguei.spitsyn at oracle.com wrote:
>> Hi David,
>>
>> Thank you for reviewing this!
>>
>> On 5/28/20 23:57, David Holmes wrote:
>>> Hi Serguei,
>>>
>>> On 28/05/2020 3:12 pm, serguei.spitsyn at oracle.com wrote:
>>>> Hi David,
>>>>
>>>> I've updated the CSR and webrev in place.
>>>>
>>>> The changes are:
>>>> - addressed David's suggestion to rephrase StopThread description
>>>> change
>>>> - replaced JVMTI_ERROR_INVALID_OBJECT with
>>>> JVMTI_ERROR_ILLEGAL_ARGUMENT
>>>> - updated the implementation in jvmtiEnv.cpp to return
>>>> JVMTI_ERROR_ILLEGAL_ARGUMENT
>>>> - updated one of the nsk.jvmti StopThread tests to check error
>>>> case with the JVMTI_ERROR_ILLEGAL_ARGUMENT
>>>>
>>>>
>>>> I'm reposting the links for convenience.
>>>>
>>>> Enhancement:
>>>> https://bugs.openjdk.java.net/browse/JDK-8234882
>>>>
>>>> CSR draft:
>>>> https://bugs.openjdk.java.net/browse/JDK-8245853
>>>
>>> Spec updates are good - thanks.
>>
>> Thank you for the CSR review.
>>
>>>> Webrev:
>>>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2020/jvmti-stop-thread.1/src/
>>>>
>>>
>>> src/hotspot/share/prims/jvmtiEnv.cpp
>>>
>>> The ThreadDeath check is fine but I'm a bit confused about the
>>> additional null check that leads to JVMTI_ERROR_INVALID_OBJECT. I
>>> can't see how resolve_external_guard can return NULL when not passed
>>> in NULL. Nor why that would result in JVMTI_ERROR_INVALID_OBJECT
>>> rather than JVMTI_ERROR_NULL_POINTER. And I note
>>> JVMTI_ERROR_NULL_POINTER is not even a listed error for StopThread!
>>> This part of the change seems unrelated to this issue.
>>
>> I was also surprised with the JVMTI_ERROR_NULL_POINTER and
>> JVMTI_ERROR_INVALID_OBJECT error codes.
>> The JVM TI spec automatic generation adds these two error codes for a
>> jobject parameter.
>>
>> Also, they both are from the Universal Errors section:
>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2020/jvmti-stop-thread.1/docs/specs/jvmti.html#universal-error
>>
>>
>> You can find a link to this section at the start of the Error section:
>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2020/jvmti-stop-thread.1/docs/specs/jvmti.html#StopThread
>>
>>
>> My understanding (not sure, it is right) is that NULL has to be
>> reported with JVMTI_ERROR_NULL_POINTER and a bad
>> jobject (for instance, a WeakReference with a GC-ed target) has to be
>> reported with JVMTI_ERROR_INVALID_OBJECT.
>> At least, I was not able to construct a test case to get this error
>> code returned.
>> So, I'm puzzled with this. I'll try to find some examples with
>> JVMTI_ERROR_NULL_POINTER errors.
>
> Found the explanation.
> The JDI file:
> src/jdk.jdi/share/classes/com/sun/tools/jdi/JDWPException.java
>
> has a fragment that translate the INVALID_OBJECT error to the
> ObjectCollectedException:
> RuntimeException toJDIException() {
> switch (errorCode) {
> case JDWP.Error.INVALID_OBJECT:
> return new ObjectCollectedException();
>
> So, the INVALID_OBJECT is for a jobject handle that is referencing a
> collected object.
> It means that previous implementation incorrectly returned
> JVMTI_ERROR_NULL_POINTER error code.
I should create and delete local or global ref to construct a test case
for this.
Interesting that the JDWPException::toJDIException() does not convert
the ILLEGAL_ARGUMENT error code to an IllegalArgumentException.
I've just added this conversion.
Thanks,
Serguei
> Thanks,
> Serguei
>
>>> test/hotspot/jtreg/vmTestbase/nsk/jvmti/StopThread/stopthrd006/TestDescription.java
>>>
>>>
>>> The copyright year should be change to "2018, 2020,".
>> Thank you for the catch.
>> I planned to update the copyright comments.
>>
>>> I'm a little surprised the test doesn't actually check that a valid
>>> call doesn't produce an error. But that's an existing quirk of the
>>> test and not something you need to address here (if indeed it needs
>>> addressing - perhaps there is another test for that).
>>
>> There are plenty of other nsk.jvmti tests which check valid calls.
>>
>> Thanks,
>> Serguei
>>>
>>> Thanks,
>>> David
>>> -----
>>>
>>>>
>>>> Updated JVM TI StopThread spec:
>>>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2020/jvmti-stop-thread.1/docs/specs/jvmti.html#StopThread
>>>>
>>>>
>>>>
>>>> The old webrev and spec are here:
>>>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2020/jvmti-stop-thread.0/
>>>>
>>>>
>>>> Thanks,
>>>> Serguei
>>>>
>>>> On 5/27/20 18:03, serguei.spitsyn at oracle.com wrote:
>>>>> Hi David,
>>>>>
>>>>>
>>>>> On 5/27/20 02:00, David Holmes wrote:
>>>>>> On 27/05/2020 6:36 pm, serguei.spitsyn at oracle.com wrote:
>>>>>>> Hi David,
>>>>>>>
>>>>>>>
>>>>>>> On 5/27/20 00:47, David Holmes wrote:
>>>>>>>> Hi Serguei,
>>>>>>>>
>>>>>>>> On 27/05/2020 1:01 pm, serguei.spitsyn at oracle.com wrote:
>>>>>>>>> Please, review a fix for:
>>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8234882
>>>>>>>>>
>>>>>>>>> CSR draft (one CSR reviewer is needed before finalizing it):
>>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8245853
>>>>>>>>
>>>>>>>> I have some thoughts on the wording which I will add to the CSR.
>>>>>>>
>>>>>>> Thank you a lot for looking at this!
>>>>>>>
>>>>>>>> Also on reflection I think JVMTI_ERROR_ILLEGAL_ARGUMENT would
>>>>>>>> the best error to use, and it has an equivalent in JDWP and at
>>>>>>>> the Java level for JDI.
>>>>>>>
>>>>>>> This is an interesting variant, thanks!
>>>>>>> We need to balance on several criteria:
>>>>>>> 1) Compatibility: keep returning error as close as possible to
>>>>>>> the current spec
>>>>>>
>>>>>> If you are adding a new error condition I don't understand what
>>>>>> you mean by "close to the current spec" ??
>>>>>
>>>>> If the JVMTI_ERROR_INVALID_OBJECT is returned than the JDWP agent
>>>>> does not need any new error handling.
>>>>> The same can be true in the JDI if the JDWP returns the same error
>>>>> as it returned before.
>>>>> In this case we do not add new error code but extend the existing
>>>>> to cover new error condition.
>>>>>
>>>>> But, in fact (especially, after rethinking), I do not like the
>>>>> JVMTI_ERROR_INVALID_OBJECT
>>>>> error code as it normally means something different.
>>>>> So, let's avoid using it and skip this criteria.
>>>>> Then we need new error code to cover new error condition.
>>>>>
>>>>>>> 2) Best error naming match between JVM TI and JDI/JDWP
>>>>>>> 3) Best practice in errors naming
>>>>>>
>>>>>> If the argument is not a ThreadDeath instance then it is an
>>>>>> illegal argument - perfect fit semantically all the specs
>>>>>> involved have an "illegal argument" error form.
>>>>>
>>>>> I agree with this.
>>>>> It is why I like this suggestion. :)
>>>>> The JDWP equivalent is: ILLEGAL_ARGUMENT.
>>>>> The JDI equivalent is: IllegalArgumentException
>>>>>
>>>>> I'll prepare and send the update.
>>>>>
>>>>> Thanks!
>>>>> Serguei
>>>>>
>>>>>
>>>>>> Cheers,
>>>>>> David
>>>>>>
>>>>>>> I think the #1 is most important but will look at it once more.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Serguei
>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> David
>>>>>>>>
>>>>>>>>> Webrev:
>>>>>>>>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2020/jvmti-stop-thread.1/src/
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Updated JVM TI StopThread spec:
>>>>>>>>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2020/jvmti-stop-thread.1/docs/specs/jvmti.html#StopThread
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Summary:
>>>>>>>>>
>>>>>>>>> The JVM TI StopThread method mirrored the functionality of the
>>>>>>>>> java.lang.Thread::stop(Throwable t) method, in that it
>>>>>>>>> allows any exception
>>>>>>>>> type to be installed as an asynchronous exception in the
>>>>>>>>> target thread.
>>>>>>>>> However, the java.lang.Thread::stop(Throwable t) method was
>>>>>>>>> inherently unsafe
>>>>>>>>> and in Java 8 (under JDK-7059085) it was "retired" so that
>>>>>>>>> it always threw
>>>>>>>>> UnsupportedOperationException.
>>>>>>>>> The updated JVM TI StopThread spec disallows an arbitrary
>>>>>>>>> Throwable from being passed,
>>>>>>>>> and instead restricts the argument to being an instance of
>>>>>>>>> ThreadDeath, thus
>>>>>>>>> mirroring the (deprecated but still functional)
>>>>>>>>> java.lang.Thread::stop() method.
>>>>>>>>> The error JVMTI_ERROR_INVALID_OBJECT is returned if the
>>>>>>>>> exception argument
>>>>>>>>> is not an instance of ThreadDeath.
>>>>>>>>>
>>>>>>>>> Also, I will file similar RFE and CSR on the JDI and JDWP
>>>>>>>>> spec.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Testing:
>>>>>>>>> Built docs and checked the doc has been generated as expected.
>>>>>>>>> Will run the nsk.jvmti tests locally.
>>>>>>>>> Will submit hs-tiers1-3 to make sure there are no
>>>>>>>>> regressions in the JVM TI and JDI tests.
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> Serguei
>>>>>>>
>>>>>
>>>>
>>
>
More information about the serviceability-dev
mailing list