RFR: 8235966: Process obsolete flags less aggressively
Daniel D. Daugherty
daniel.daugherty at oracle.com
Wed Dec 18 17:37:29 UTC 2019
Hi David,
On 12/17/19 5:03 PM, David Holmes wrote:
> Hi Dan,
>
> Thanks for taking a look. Updated webrev:
>
> http://cr.openjdk.java.net/~dholmes/8235966/webrev.v2/
src/hotspot/share/runtime/arguments.cpp
I like the updates to header comment for verify_special_jvm_flags().
Thumbs up.
>
> Discussion below.
Replies below.
>
> On 18/12/2019 1:47 am, Daniel D. Daugherty wrote:
>> On 12/16/19 12:16 AM, David Holmes wrote:
>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8235966
>>> webrev: http://cr.openjdk.java.net/~dholmes/8235966/webrev/
>>
>> src/hotspot/share/runtime/arguments.cpp
>> L745: // if flag has become obsolete it should not have a
>> "globals" flag defined anymore.
>> L746: if (!version_less_than(JDK_Version::current(),
>> flag.obsolete_in)) {
>> L747: if (JVMFlag::find_declared_flag(flag.name) != NULL) {
>> L748: // Temporarily disable the warning: 8196739
>> L749: // warning("Global variable for obsolete special
>> flag entry \"%s\" should be removed", flag.name);
>> L750: }
>> L751: }
>> It seems like we've been down a similar road before:
>>
>> JDK-8196739 Disable obsolete/expired VM flag transitional
>> warnings
>> https://bugs.openjdk.java.net/browse/JDK-8196739
>>
>> This one may ring a bell... Fixed by dholmes in jdk11-b01...
>> :-)
>>
>> And this followup sub-task to re-enable that warning:
>>
>> JDK-8196741 Re-enable obsolete/expired VM flag transitional
>> warnings
>> https://bugs.openjdk.java.net/browse/JDK-8196741
>>
>> was closed as "Won't fix" on 2019.08.02.
>>
>> So the obvious questions:
>>
>> - Why is the new warning less problematic to tests that don't
>> tolerate unexpected output?
>
> Two different situations. The commented out warning happens
> unconditionally when you run the VM and it finds any flag marked
> obsolete that hasn't been removed. Hence every single test will
> encounter this warning.
Ouch on such verbosity.
> The situation I am modifying is when a test uses a flag that is marked
> for obsoletion. In the majority of cases the flag is already
> deprecated and so already issuing a deprecation warning that the test
> has to handle. Without my change there would still be an obsoletion
> warning, so this test is in for a warning no matter what.
Good that your change only comes into play when the flag is used.
> Also note that for hotspot at least we have strived to make tests
> tolerate unexpected output. The reason JDK-8196741 was closed as
> "won't fix" was because other areas wouldn't commit to doing that.
Yup. Got it.
>
>> - If you move forward with this fix, then I think think code
>> block needs to be removed or modified or am I missing
>> something?
>
> I've rewritten the comment at the head of verify_special_jvm_flags to
> explain why we can't issue a warning, and have deleted the block.
Thanks for deleting the stale code.
>
>> There's a similar commented out check on L757-L765, but that
>> one
>> is for an expired flag... You might want to adjust/delete it
>> also?
>
> Deleted.
Thanks.
>
>> L753: warning("Special flag entry \"%s\" must be
>> explicitly obsoleted before expired.", flag.name);
>> L754: success = false;
>> nit - s/before expired/before being expired/
>> Update: I now see that "style" is in several places in this
>> function. I'm not sure what to think here... it grates,
>> but I can live with it.
>>
>> nit - L75[34] indented too much by two spaces.
>
> Fixed.
>
>> L962: return real_name;
>> nit - indented too much by two spaces.
>
> Fixed.
>
>>
>> Trying to understand the modified logic in argument processing is
>> making my head spin...
>
> Mine too. It took a few attempts to put the logic in the right place
> and make adjustments so that it all works as expected for a correctly
> specified flag and an erroneous one.
I keep trying to convince myself that we're improving this flag and
options code with each release... :-)
>
>> - You've added a call to is_obsolete_flag() in
>> handle_aliases_and_deprecation() and is_obsolete_flag()
>> is where the new warning is output:
>>
>> warning("Temporarily processing option %s; support is scheduled
>> for removal in %s"
>>
>> handle_aliases_and_deprecation() is called from six different places,
>> but the call sites are different based on the argument pattern so I
>> have (mostly) convinced myself that there should not be any duplicate
>> warning lines.
>
> Right - handle_aliases_and_deprecation is only called for a
> syntactically correct flag based on those patterns. It normally
> filters out obsoleted/expired flags and lets them fall through to
> later error processing (in process_argument after parse_arg returns
> false). That error processing is where the normal obsoletion check is
> performed. So I had to not filter the flag in
> handle_aliases_and_deprecation in this case, but still produce the
> warning for a malformed flag. E.g.
>
> java -XX:+UseParallelOldGC -version
> Java HotSpot(TM) 64-Bit Server VM warning: Temporarily processing
> option UseParallelOldGC; support is scheduled for removal in 15.0
> java version "15-internal" 2020-09-15
>
> java -XX:UseParallelOldGC -version
> Java HotSpot(TM) 64-Bit Server VM warning: Temporarily processing
> option UseParallelOldGC; support is scheduled for removal in 15.0
> Missing +/- setting for VM option 'UseParallelOldGC'
> Error: Could not create the Java Virtual Machine.
Thanks for the example. That helps a lot.
>
>> So I now understand the new logic that allows an obsoleted option
>> to be specified with a warning as long as the option still exists.
>> I'm good with the technical change, but...
>>
>> I'm worried about tests that don't tolerate the new warning mesg,
>> i.e., why wouldn't this become an issue again:
>>
>> JDK-8196739 Disable obsolete/expired VM flag transitional warnings
>
> Explained above.
Yup and thanks.
Dan
>
> Thanks,
> David
>
>> Dan
>>
>>
>>>
>>> When a flag is marked as obsolete in the special-flags table we will
>>> ignore it and issue a warning that it is being ignored, as soon as
>>> we bump the version of the JDK. That means that any tests still
>>> using the obsolete flag may start to fail, leading to a surge of
>>> test failures at the start of a release cycle. For example for JDK
>>> 15 we have a whole bunch of JFR tests that fail because they still
>>> try to work with UseParallelOldGC. In another case
>>> runtime/cds/appcds/FieldLayoutFlags.java passes only be accident.
>>>
>>> When a flag is marked as obsolete for a release, all code involving
>>> that flag (including tests that use it) must be updated within that
>>> release and the flag itself removed. Whilst this is typically
>>> scheduled early in a release cycle it isn't reasonable to expect it
>>> to all occur within the first couple of days of the release cycle,
>>> nor do we want to have to ProblemList a bunch of tests when they
>>> start failing.
>>>
>>> What I propose is to instead allow an obsolete flag to continue to
>>> be processed as long as that code removal has not actually occurred
>>> - with an adjusted warning. The change I propose:
>>>
>>> - only treats an obsolete flag as obsolete if the flag cannot be found
>>> - added a new flag verification rule that disallows obsoletion in an
>>> undefined version, but expiration in a specific version i.e. we must
>>> always explicitly obsolete a flag before we expire it.
>>>
>>> The only downside here is that if we actually forget to file an
>>> issue for the actual obsoletion work we may not notice via testing.
>>> Of course whenever a change is made to the flags table to add an
>>> entry then the issue to do the obsoletion should be filed at the
>>> same time.
>>>
>>> Thanks,
>>> David
>>> -----
>>>
>>
More information about the hotspot-dev
mailing list