RFR (xs) 8251209 [TESTBUG] CDS jvmti tests should use "@modules java.instrument"
David Holmes
david.holmes at oracle.com
Fri Aug 7 06:41:58 UTC 2020
On 7/08/2020 4:13 pm, Ioi Lam wrote:
> On 8/6/20 11:01 PM, David Holmes wrote:
>> On 7/08/2020 2:41 pm, Ioi Lam wrote:
>>> On 8/6/20 5:58 PM, David Holmes wrote:
>>>> Correction ...
>>>>
>>>> On 7/08/2020 7:52 am, David Holmes wrote:
>>>>> Hi Ioi,
>>>>>
>>>>> On 7/08/2020 4:25 am, Ioi Lam wrote:
>>>>>> https://bugs.openjdk.java.net/browse/JDK-8251209
>>>>>> http://cr.openjdk.java.net/~iklam/jdk16/8251209-cds-jvmti-tests-modules-tag.v01/
>>>>>>
>>>>>>
>>>>>> Summary -- changed the tests from (mis)using
>>>>>>
>>>>>> * @requires vm.flavor != "minimal"
>>>>>>
>>>>>> to
>>>>>>
>>>>>> * @modules java.instrument
>>>>>>
>>>>>> ... to be consistent with other jvmti tests.
>>>>>
>>>>> That seems like an invalid precondition to me. It would have been
>>>>> somewhat valid in the Compact Profiles world when we did not
>>>>> provide "java.instrument" in the profiles which supported
>>>>> MinimalVM, but you can define a minimal VM in a build that still
>>>>> has all modules available. I don't think building the minimal VM
>>>>> makes any changes to the supported modules.
>>>>>
>>>>> Also AIUI the @modules statement simply adds the necessary
>>>>> command-line args to use the java.instrument module (if present),
>>>>> it doesn't ensure that the listed module has to be present.
>>>>
>>>> It does in fact ensure that:
>>>>
>>>> "Otherwise, a test will not be run if the system being tested does
>>>> not contain all of the specified modules."
>>>>
>>>> http://openjdk.java.net/jtreg/tag-spec.html
>>>>
>>>> But as I said the module could be present in a JRE but you are still
>>>> using the MinimalVM.
>>>>
>>>
>>> Hi David,
>>>
>>> As I mentioned above, I am following the same rule as other jvmti
>>> tests, which only use "@modules java.instrument" and do not check
>>> whether the VM is minimal. E.g.,
>>>
>>> http://hg.openjdk.java.net/jdk/jdk/file/4d36e29a5410/test/hotspot/jtreg/serviceability/jvmti/GetObjectSizeClass.java
>>
>>
>>
>> Sure but I contend those tests are wrong and the tests you are
>> changing are right (or more right given common test configurations).
>>
>>>
>>> -------
>>>
>>> If I understand correctly, you're saying someone can build a minimal
>>> JDK (configure --with-jvm-variants=minimal), and then try to add the
>>> java.instrument module to it. I.e., adding the following module to
>>> your JDK (with jlink, or by hand).
>>
>> Just build a JDK with multiple VMs present.
>>
>>>
>>> $ unzip -l ./jmods/java.instrument.jmod
>>> Length Date Time Name
>>> --------- ---------- ----- ----
>>> 294 2020-08-04 17:03 classes/module-info.class
>>> 1102 2020-08-04 17:03
>>> classes/sun/instrument/TransformerManager$TransformerInfo.class
>>> 4294 2020-08-04 17:03
>>> classes/sun/instrument/TransformerManager.class
>>> 911 2020-08-04 17:03
>>> classes/sun/instrument/InstrumentationImpl$1.class
>>> 16663 2020-08-04 17:03
>>> classes/sun/instrument/InstrumentationImpl.class
>>> 1356 2020-08-04 17:03
>>> classes/java/lang/instrument/ClassFileTransformer.class
>>> 554 2020-08-04 17:03
>>> classes/java/lang/instrument/IllegalClassFormatException.class
>>> 1734 2020-08-04 17:03
>>> classes/java/lang/instrument/Instrumentation.class
>>> 563 2020-08-04 17:03
>>> classes/java/lang/instrument/UnmodifiableModuleException.class
>>> 970 2020-08-04 17:03
>>> classes/java/lang/instrument/ClassDefinition.class
>>> 551 2020-08-04 17:03
>>> classes/java/lang/instrument/UnmodifiableClassException.class
>>> 3244 2020-08-04 17:03 legal/COPYRIGHT
>>> 44 2020-08-04 17:03 legal/LICENSE
>>> 50920 2020-08-04 17:03 lib/libinstrument.so<<<<<<<<<
>>>
>>> But this module has a native library, libinstrument.so, which
>>> requires JVMTI to be present in libjvm.so. E.g.:
>>>
>>> jvmtiEnv *
>>> retransformableEnvironment(JPLISAgent * agent) {
>>> ....
>>> jnierror = (*agent->mJVM)->GetEnv( agent->mJVM,
>>> (void **) &retransformerEnv,
>>> JVMTI_VERSION_1_1);
>>>
>>> So if you try to run the CDS JVMTI test cases, it will be executed
>>> (because your JDK says "I have java.instrument") and the test finds
>>> out that your JDK's java.instrument module isn't working properly. So
>>> the test is doing exactly what it's supposed to do.
>>
>> The whole point of the @requires is to not waste time and resources
>> running a test on a platform that cannot run the test successfully.
>>
>> So the fully correct solution could be to have both settings:
>>
>> @requires vm.flavor != "minimal"
>> @modules java.instrument
>>
>> if you require both a VM that supports JVM TI and you need a JRE that
>> includes the java.instrument module. But that assumes your test does
>> need java.instrument. Not all JVM TI tests need java.instrument, but
>> all instrumentation tests depend on JVM TI. Just looking at the first
>> three of tests in your webrev I don't see any dependency on
>> java.instrument - they are CDS only tests as far as I can see and so
>> require a VM with CDS which means not a Minimal VM - though perhaps it
>> is sufficient to have the
>>
>> @requires vm.cds
>>
>> in those cases?
>>
>> For the other JVM TI related tests using -javaagent they probably need
>> both @requires and @module.
>
> You can disable JVMTI with "configure --disable-jvm-feature-jvmti". So
> checking for vm.flavor != "minimal" is not sufficient.
Not it isn't but we don't try to accommodate every possible VM feature
and module that someone could create a JRE with. Otherwise we will need
an @require capability for every selectable feature and we would need to
update every test to explicitly list every dependency.
But we do build a minimal VM and people can test the minimal VM, and if
you build the minimal VM as part a multi-VM JRE then you do have
java.instrument present. So only testing for the module, instead of
testing for a non-minimal VM is not sufficient and changing tests to do
that is a step in the wrong direction IMO.
Cheers,
David
> Similarly, "@requires vm.cds" doesn't guarantee that JVMTI is supported.
>
> Maybe we should have a new VM prop so we can do
>
> @requires vm.jvmti
> @modules java.instrument
>
> Thanks
> - Ioi
>
>
>
>>
>> David
>> -----
>>
>>> I would argue that this is better than before (which would exclude
>>> the test when the libjvm.so is a minimal build, and would will not
>>> detect such a mis-configured java.instrument module.)
>>>
>>>
>>> Thanks
>>> - Ioi
>>>
>>>
>
More information about the serviceability-dev
mailing list