JVM Flag ergonomics and constraints
Ioi Lam
ioi.lam at oracle.com
Mon Feb 6 17:19:35 UTC 2023
On 2/5/2023 11:45 PM, David Holmes wrote:
> On 6/02/2023 5:26 pm, Ioi Lam wrote:
>> On 2/3/2023 12:40 AM, David Holmes wrote:
>>> On 3/02/2023 5:12 pm, Ioi Lam wrote:
>>>>
>>>>
>>>> On 2/1/2023 10:37 PM, David Holmes wrote:
>>>>> <trimming>
>>>>>
>>>>> On 2/02/2023 3:25 pm, Thomas Stüfe wrote:
>>>>>> On Thu, Feb 2, 2023 at 5:30 AM David Holmes
>>>>>> <david.holmes at oracle.com <mailto:david.holmes at oracle.com>> wrote:
>>>>>>
>>>>>> That would have to be determined case-by-case. For each ergo
>>>>>> flag we
>>>>>> would have to decide what value it is calculating and based
>>>>>> on what,
>>>>>> and
>>>>>> determine whether an out-of-range value is an error or
>>>>>> something to be
>>>>>> wary of.
>>>>>>
>>>>>> Sure, what I meant was how to control it? Two sets of
>>>>>> FLAT_SET_... macros, one that asserts on constraint violation,
>>>>>> one that caps?
>>>>>
>>>>> No I expect to just see the places where FLAG_SET_ERGO is called
>>>>> do the right thing by checking the return value and proceeding
>>>>> accordingly.
>>>>
>>>> David, are you proposing this?
>>>>
>>>> int value = calculate_ergo();
>>>> if (FLAG_SET_ERGO (TheFlag, value) == error) {
>>>> value = do_it_again()
>>>> if (FLAG_SET_ERGO (TheFlag, value) == error) {
>>>> huh?
>>>> }
>>>> }
>>>>
>>>> In the above code, all FLAG_SET_ERGO does is to check the range for
>>>> you. It doesn't tell you why the range check fails. So the caller
>>>> would have to redo the calculation (with no more information, other
>>>> than that the last value was no good). What if the new value is
>>>> also no good?
>>>
>>> To me that indicates we don't know what the heck we are calculating!
>>> How can you calculate a setting for a flag if you don't even
>>> understand the valid range of that flag. Which may mean the max, for
>>> example, needs to be exposed programmatically.
>>>
>>>> With this style, you almost have to wrap every FLAG_SET_ERGO in a
>>>> loop, keep trying (in the dark) until you succeed.
>>>>
>>>> ==================
>>>> I think it's better to just assert inside FLAG_SET_ERGO if the
>>>> value is out of range. The caller should make sure it has
>>>> calculated a correct value.
>>>
>>> If the calculation uses some externally settable value then an
>>> assert won't help if we're in a product build.
>>>
>>
>> We have lots of set_xxx() APIs in various classes that assert when
>> given an inappropriate value -- this indicates a programming error.
>> So FLAG_SET_ERGO would be no different.
>>
>> It's the responsibility of the caller of FLAG_SET_ERGO to pass a
>> correct value to FLAG_SET_ERGO . How the caller comes up with that
>> value (whether it depends on some external input) is irrelevant.
>> ========
>>
>> To properly catch the programming errors with ERGO setting, we should:
>>
>> - Change FLAG_SET_ERGO to return "void". The current API gives the
>> false impression that the caller needs to check the returned value
>> and do something about it.
>
> That's because they do! You still need to be able to report an error
> for product builds if the value is being calculated based on some
> passed in runtime value.
>
That should be done by the code that calls FLAG_SET_ERGO, not by
FLAG_SET_ERGO itself. E.g., if an environment variable would cause an
invalid ERGO setting, the code that handles this variable should report
an error and should NOT call FLAG_SET_ERGO with an invalid value.
FLAG_SET_ERGO knows nothing about such env variables and cannot print
out a meaningful error message.
> Putting in an assert is fine but not sufficient.
>
> David
> -----
>
>> - Assert if the value is out of range, so we can catch the
>> programming error during testing (with debug builds)
>>
>> It's up to the caller of FLAG_SET_ERGO to determine a value that's
>> within the allowed range.
>>
>> If the caller wants to query the constraints of the flag that it
>> wants to set, that can be done via the JVMFlagLimit API. Using
>> JVMFlagLimit is much better than blindly setting a value and getting
>> an error code that doesn't tell you why it failed.
>>
>>
>>> As I said it depends on exactly what we are using to do the
>>> calculation. If it is "closed world" then it is a fatal error to get
>>> it wrong and should be detected during testing. Otherwise the code
>>> has to deal with the possibility of error.
>>>
>>>>
>>>> Maybe we can add a new FLAG_SET_ERGO_CAPPED() that would cap the
>>>> value, but that should be an opt-in. FLAG_SET_ERGO() should not
>>>> automatically cap the value.
>>>
>>> That might be suitable for some flags/calculations.
>>>
>>> I don't like trying to talk about this in generalities. Each
>>> specific situation needs to be examined to understand what is being
>>> calculated and how. But it is the callers of FLAG_SET_ERGO that need
>>> to know what they are doing.
>>>
>>> Cheers,
>>> David
>>>
>>>>
>>>> Thanks
>>>> - Ioi
>>>>
>>
More information about the hotspot-dev
mailing list