Hi Xintong,

I don’t really see the actual practical benefit from removing the getstring
and setstring low level methods.

I understand that ConfigOptions are nicer for 95% of the cases but from a
technical point of view there will always be cases where a more flexible
dynamic handling is necessary without the added overhead of the toMap logic.

I think it’s the most natural thing for any config abstraction to expose
basic get set methods with a simple key.

What do you think?

Cheers
Gyula

On Thu, 14 Dec 2023 at 08:00, Xintong Song <tonysong...@gmail.com> wrote:

> >
> > IIUC, you both prefer using ConfigOption instead of string keys for
> > all use cases, even internal ones. We can even forcefully delete
> > these @Depreated methods in Flink-2.0 to guide users or
> > developers to use ConfigOption.
> >
>
> Yes, at least from my side.
>
>
> I noticed that Configuration is used in
> > DistributedCache#writeFileInfoToConfig and readFileInfoFromConfig
> > to store some cacheFile meta-information. Their keys are
> > temporary(key name with number) and it is not convenient
> > to predefine ConfigOption.
> >
>
> True, this one requires a bit more effort to migrate from string-key to
> ConfigOption, but still should be doable. Looking at how the two mentioned
> methods are implemented and used, it seems what is really needed is
> serialization and deserialization of `DistributedCacheEntry`-s. And all the
> entries are always written / read at once. So I think we can serialize the
> whole set of entries into a JSON string (or something similar), and use one
> ConfigOption with a deterministic key for it, rather than having one
> ConfigOption for each field in each entry. WDYT?
>
>
> If everyone agrees with this direction, we can start to refactor all
> > code that uses getXxx(String key, String defaultValue) into
> > getXxx(ConfigOption<Xxx> configOption), and completely
> > delete all getXxx(String key, String defaultValue) in 2.0.
> > And I'm willing to pick it up~
> >
>
> Exactly. Actually, Xuannan and a few other colleagues are working on
> reviewing all the existing configuration options. We identified some common
> issues that can potentially be improved, and not using string-key is one of
> them. We are still summarizing the findings, and will bring them to the
> community for discussion once ready. Helping hands is definitely welcomed.
> :)
>
>
> Yeah, `toMap` can solve the problem, and I also mentioned it in the
> > initial mail.
> >
>
> True. Sorry I overlooked it.
>
>
> Best,
>
> Xintong
>
>
>
> On Thu, Dec 14, 2023 at 2:14 PM Rui Fan <1996fan...@gmail.com> wrote:
>
> > Thanks Xintong and Xuannan for the feedback!
> >
> > IIUC, you both prefer using ConfigOption instead of string keys for
> > all use cases, even internal ones. We can even forcefully delete
> > these @Depreated methods in Flink-2.0 to guide users or
> > developers to use ConfigOption.
> >
> > Using ConfigOption is feasible in all scenarios because ConfigOption
> > can be easily created via
> > `ConfigOptions.key("xxx").stringType().noDefaultValue()` even if
> > there is no predefined ConfigOption.
> >
> > I noticed that Configuration is used in
> > DistributedCache#writeFileInfoToConfig and readFileInfoFromConfig
> > to store some cacheFile meta-information. Their keys are
> > temporary(key name with number) and it is not convenient
> > to predefine ConfigOption.
> >
> > If everyone agrees with this direction, we can start to refactor all
> > code that uses getXxx(String key, String defaultValue) into
> > getXxx(ConfigOption<Xxx> configOption), and completely
> > delete all getXxx(String key, String defaultValue) in 2.0.
> > And I'm willing to pick it up~
> >
> > To Xintong:
> >
> > > I think a `toMap` as suggested by Zhu and Xuannan should solve the
> > > problem. Alternatively, we may also consider providing an iterator for
> > the
> > > Configuration.
> >
> > Yeah, `toMap` can solve the problem, and I also mentioned it in the
> > initial mail.
> >
> > Also Providing an iterator is fine, but we don't have a strong
> > requirement for now. Simple is better, how about considering it
> > if we have other strong requirements in the future?
> >
> > Looking forwarding to your feedback, thanks~
> >
> > Best,
> > Rui
> >
> > On Thu, Dec 14, 2023 at 11:36 AM Xintong Song <tonysong...@gmail.com>
> > wrote:
> >
> >> I'm leaning towards not allowing string-key based configuration access
> in
> >> the long term.
> >>
> >> I see the Configuration being used in two different ways:
> >>
> >> 1. Writing / reading a specific option. In such cases, ConfigOption has
> >> many advantages compared to string-key, such as explicit value type,
> >> descriptions, default values, deprecated / fallback keys. I think we
> >> should
> >> encourage, and maybe even enforce, choosing ConfigOption over
> string-keys
> >> in such specific option access scenarios. That also applies to internal
> >> usages, for which the description may not be necessary because we won't
> >> generate documentation from it but we can still benefit from other
> >> advantages.
> >>
> >> 2. Iterating over all the configured options. In such cases, it is
> >> currently impractical to find the proper ConfigOption for each
> configured
> >> option. I think a `toMap` as suggested by Zhu and Xuannan should solve
> the
> >> problem. Alternatively, we may also consider providing an iterator for
> the
> >> Configuration.
> >>
> >> I think if we want to encourage using ConfigOption in case-1, the most
> >> effective way is to not allow accessing a specific option with a
> >> string-key, so that developers not awaring of this discussion won't
> >> accidentally use it. On the other hand, case-2 is a much rarer use case
> >> compared to case-1, and given the fact that there are alternative
> >> approaches, I think we should not compromise case-1 for it.
> >>
> >> WDYT?
> >>
> >> Best,
> >>
> >> Xintong
> >>
> >>
> >>
> >> On Thu, Dec 14, 2023 at 10:25 AM Xuannan Su <suxuanna...@gmail.com>
> >> wrote:
> >>
> >> > Hi Rui,
> >> >
> >> > We are currently revisiting all the configurations for Flink 2.0, and
> >> > it turns out that many string-based configurations in
> >> > `ConfigConstants` are deprecated and have been replaced by
> >> > `ConfigOptions`. Since `ConfigOptions` offers many advantages over
> >> > string-based configurations for the end user, I believe we should
> >> > encourage users to set and get the Flink configuration exclusively
> >> > with `ConfigOption`. And we are going to eventually replace all the
> >> > string-based configurations with `ConfigOptions` for this use case.
> >> >
> >> > For the first use case you mentioned, I think they are all internal
> >> usage,
> >> > and we should aim to replace them with ConfigOptions gradually.
> >> > Meanwhile, we may consider making those getters/setters for internal
> >> > use only while the replacement is in progress.
> >> >
> >> > For the second use case, IIUC, you need to iterate over all the
> >> > configurations to replace some old configuration keys with new ones. I
> >> > believe  `toMap` is suitable for this scenario.
> >> >
> >> > Best,
> >> > Xuannan
> >> >
> >> >
> >> >
> >> > On Wed, Dec 13, 2023 at 9:04 PM Rui Fan <1996fan...@gmail.com> wrote:
> >> > >
> >> > > Thanks Zhu for the quick response!
> >> > >
> >> > > > It is not a blocker of the deprecation, epsecially given that they
> >> are
> >> > > not standard
> >> > > > configuration and are just using Configuration class for
> >> convenience.
> >> > >
> >> > > Yes, it's not a blocker of deprecation.
> >> > >
> >> > > > These are internal usages and we can have an internal getter
> method
> >> for
> >> > > them.
> >> > >
> >> > > For case1, do you mean we reuse the old getString method as the
> >> internal
> >> > > getter method or add a new getter method?
> >> > >
> >> > > Anyway, it's fine for me if we have an internal getter method. As I
> >> > > understand,
> >> > > the public method without any annotation will be the internal
> method,
> >> > right?
> >> > >
> >> > > > Not sure why it's required to convert all keys or values. If it is
> >> used
> >> > > > to create strings for dynamic properties or config files to deploy
> >> > jobs,
> >> > > > toMap()/toFileWritableMap() may be a better choice. They are
> already
> >> > > > used in this kind of scenarios.
> >> > >
> >> > > For case2, it's really a special scenario, and toMap() is fine for
> >> case2.
> >> > > Case2 uses the getString instead of toMap due to getString is
> easier.
> >> > > Also, kubernetes-operator is also a internal usage, if case1 is
> >> solved,
> >> > > case2 also can use the internal getter method.So we can focus on
> >> case1.
> >> > >
> >> > > Thank you
> >> > >
> >> > > Best,
> >> > > Rui
> >> > >
> >> > > On Wed, Dec 13, 2023 at 8:01 PM Zhu Zhu <reed...@gmail.com> wrote:
> >> > >
> >> > > > Hi Rui,
> >> > > >
> >> > > > I'd like to understand why there is a strong requirement for these
> >> > > > deprecated
> >> > > > methods. The ConfigOption param methods help to do the type
> >> conversion
> >> > so
> >> > > > that users do not need to do it by themselves.
> >> > > >
> >> > > > For the 2 reasons to keep these methods mentioned above:
> >> > > >
> >> > > > > 1. A lot of scenarios don't define the ConfigOption, they using
> >> > > > String as the key and value directly, such as: StreamConfig,
> >> > > > TaskConfig, DistributedCache, etc.
> >> > > >
> >> > > > These are internal usages and we can have an internal getter
> method
> >> for
> >> > > > them.
> >> > > > It is not a blocker of the deprecation, epsecially given that they
> >> are
> >> > not
> >> > > > standard
> >> > > > configuration and are just using Configuration class for
> >> convenience.
> >> > > >
> >> > > > > 2. Some code wanna convert all keys or values, this converting
> >> > > > is generic, so the getString(String key, String defaultValue) is
> >> > needed.
> >> > > > Such as: kubernetes-operator [3].
> >> > > >
> >> > > > Not sure why it's required to convert all keys or values. If it is
> >> used
> >> > > > to create strings for dynamic properties or config files to deploy
> >> > jobs,
> >> > > > toMap()/toFileWritableMap() may be a better choice. They are
> already
> >> > > > used in this kind of scenarios.
> >> > > > If it just needs to read some of the config, why not using the
> >> proposed
> >> > > > way to read and parse the config? Pre-defined ConfigOptions are
> >> better
> >> > > > for configuration maintenance, compared to arbitrary strings
> >> > > >
> >> > > > Thanks,
> >> > > > Zhu
> >> > > >
> >> > > > Rui Fan <1996fan...@gmail.com> 于2023年12月13日周三 19:27写道:
> >> > > >
> >> > > >> Thanks Martijn for the quick clarification!
> >> > > >>
> >> > > >> I see Zhu Zhu and Junrui Lee are working on configuration related
> >> > > >> work of Flink-2.0. I would cc them, and hear some thoughts from
> >> them.
> >> > > >>
> >> > > >> Best,
> >> > > >> Rui
> >> > > >>
> >> > > >> On Wed, Dec 13, 2023 at 7:17 PM Martijn Visser <
> >> > martijnvis...@apache.org>
> >> > > >> wrote:
> >> > > >>
> >> > > >>> Hi Rui,
> >> > > >>>
> >> > > >>> I'm more wondering if part of the configuration layer changes
> >> would
> >> > > >>> mean that these APIs would be removed in 2.0. Because if so,
> then
> >> I
> >> > > >>> don't think we should remove the Deprecate annotation. But I
> have
> >> > very
> >> > > >>> little visibility on the plans for the configuration layer.
> >> > > >>>
> >> > > >>> Thanks,
> >> > > >>>
> >> > > >>> Martijn
> >> > > >>>
> >> > > >>> On Wed, Dec 13, 2023 at 12:15 PM Rui Fan <1996fan...@gmail.com>
> >> > wrote:
> >> > > >>> >
> >> > > >>> > Hi Martijn,
> >> > > >>> >
> >> > > >>> > Thanks for your reply!
> >> > > >>> >
> >> > > >>> > I noticed the 2.0 is doing some work related to clean
> >> > configuration.
> >> > > >>> > But this discussion is different from other work. Most of
> other
> >> > work
> >> > > >>> > are deprecate some Apis in Flink-1.19 and remove them in
> >> Flink-2.0.
> >> > > >>> >
> >> > > >>> > This discussion is a series of methods have been marked to
> >> > @Deprecate,
> >> > > >>> > but they are still used so far. I propose remove the
> @Deprecate
> >> > > >>> annotation
> >> > > >>> > and keep these methods.
> >> > > >>> >
> >> > > >>> > In brief, I think some deprecated methods shouldn't be
> >> deprecated.
> >> > > >>> > WDYT?
> >> > > >>> >
> >> > > >>> > Please correct me if I'm wrong, thanks~
> >> > > >>> >
> >> > > >>> > Best,
> >> > > >>> > Rui
> >> > > >>> >
> >> > > >>> > On Wed, Dec 13, 2023 at 7:07 PM Martijn Visser <
> >> > > >>> martijnvis...@apache.org>
> >> > > >>> > wrote:
> >> > > >>> >
> >> > > >>> > > Hi Rui,
> >> > > >>> > >
> >> > > >>> > > Are you thinking about this as part of Flink 2.0, since that
> >> has
> >> > the
> >> > > >>> > > goal to introduce a completely clean configuration layer?
> [1]
> >> > > >>> > >
> >> > > >>> > > Best regards,
> >> > > >>> > >
> >> > > >>> > > Martijn
> >> > > >>> > >
> >> > > >>> > > [1]
> >> > https://cwiki.apache.org/confluence/display/FLINK/2.0+Release
> >> > > >>> > >
> >> > > >>> > > On Wed, Dec 13, 2023 at 11:28 AM Maximilian Michels <
> >> > m...@apache.org>
> >> > > >>> > > wrote:
> >> > > >>> > > >
> >> > > >>> > > > Hi Rui,
> >> > > >>> > > >
> >> > > >>> > > > +1 for removing the @Deprecated annotation from
> >> > `getString(String
> >> > > >>> key,
> >> > > >>> > > > String defaultValue)`. I would remove the other typed
> >> variants
> >> > with
> >> > > >>> > > > default values but I'm ok with keeping them if they are
> >> still
> >> > used.
> >> > > >>> > > >
> >> > > >>> > > > -Max
> >> > > >>> > > >
> >> > > >>> > > > On Wed, Dec 13, 2023 at 4:59 AM Rui Fan <
> >> 1996fan...@gmail.com>
> >> > > >>> wrote:
> >> > > >>> > > > >
> >> > > >>> > > > > Hi devs,
> >> > > >>> > > > >
> >> > > >>> > > > > I'd like to start a discussion to discuss whether
> >> > Configuration
> >> > > >>> > > supports
> >> > > >>> > > > > getting value based on the String key.
> >> > > >>> > > > >
> >> > > >>> > > > > In the FLIP-77[1] and FLINK-14493[2], a series of
> methods
> >> of
> >> > > >>> > > Configuration
> >> > > >>> > > > > are marked as @Deprecated, for example:
> >> > > >>> > > > > - public String getString(String key, String
> defaultValue)
> >> > > >>> > > > > - public long getLong(String key, long defaultValue)
> >> > > >>> > > > > - public boolean getBoolean(String key, boolean
> >> defaultValue)
> >> > > >>> > > > > - public int getInteger(String key, int defaultValue)
> >> > > >>> > > > >
> >> > > >>> > > > > The java doc suggests using getString(ConfigOption,
> >> String)
> >> > or
> >> > > >>> > > > > getOptional(ConfigOption), it means using ConfigOption
> as
> >> key
> >> > > >>> > > > > instead of String.
> >> > > >>> > > > >
> >> > > >>> > > > > They are depreated since Flink-1.10, but these methods
> >> still
> >> > > >>> > > > > be used in a lot of code. I think getString(String key,
> >> > String
> >> > > >>> > > > > defaultValue)
> >> > > >>> > > > > shouldn't be deprecated with 2 reasons:
> >> > > >>> > > > >
> >> > > >>> > > > > 1. A lot of scenarios don't define the ConfigOption,
> they
> >> > using
> >> > > >>> > > > > String as the key and value directly, such as:
> >> StreamConfig,
> >> > > >>> > > > > TaskConfig, DistributedCache, etc.
> >> > > >>> > > > >
> >> > > >>> > > > > 2. Some code wanna convert all keys or values, this
> >> > converting
> >> > > >>> > > > > is generic, so the getString(String key, String
> >> > defaultValue) is
> >> > > >>> > > needed.
> >> > > >>> > > > > Such as: kubernetes-operator [3].
> >> > > >>> > > > >
> >> > > >>> > > > > Based on it, I have 2 solutions:
> >> > > >>> > > > >
> >> > > >>> > > > > 1. Removing the @Deprecated for these methods.
> >> > > >>> > > > >
> >> > > >>> > > > > 2. Only removing the @Deprecated for `public String
> >> > > >>> getString(String
> >> > > >>> > > key,
> >> > > >>> > > > > String defaultValue)`
> >> > > >>> > > > > and delete other getXxx(String key, Xxx defaultValue)
> >> > directly.
> >> > > >>> > > > > They have been depreated 8 minor versions ago. In
> general,
> >> > the
> >> > > >>> > > > > getString can replace getInteger, getBoolean, etc.
> >> > > >>> > > > >
> >> > > >>> > > > > I prefer solution1, because these getXxx methods are
> used
> >> for
> >> > > >>> now,
> >> > > >>> > > > > they are easy to use and don't bring large maintenance
> >> costs.
> >> > > >>> > > > >
> >> > > >>> > > > > Note: The alternative to public String getString(String
> >> key,
> >> > > >>> String
> >> > > >>> > > > > defaultValue)
> >> > > >>> > > > > is Configuration.toMap. But the ease of use is not very
> >> > > >>> convenient.
> >> > > >>> > > > >
> >> > > >>> > > > > Looking forward to hear more thoughts about it! Thank
> you~
> >> > > >>> > > > > Also, very much looking forward to feedback from Dawid,
> >> the
> >> > > >>> author of
> >> > > >>> > > > > FLIP-77.
> >> > > >>> > > > >
> >> > > >>> > > > > [1] https://cwiki.apache.org/confluence/x/_RPABw
> >> > > >>> > > > > [2] https://issues.apache.org/jira/browse/FLINK-14493
> >> > > >>> > > > > [3]
> >> > > >>> > > > >
> >> > > >>> > >
> >> > > >>>
> >> >
> >>
> https://github.com/apache/flink-kubernetes-operator/pull/729/files#r1424811105
> >> > > >>> > > > >
> >> > > >>> > > > > Best,
> >> > > >>> > > > > Rui
> >> > > >>> > >
> >> > > >>>
> >> > > >>
> >> >
> >>
> >
>

Reply via email to