Sounds make sense. We will do it in the FLIP. Best, Rui
On Thu, 21 Dec 2023 at 10:20, Xintong Song <tonysong...@gmail.com> wrote: > Ideally, public API changes should go through the FLIP process. > > I see the point that starting a FLIP for such a tiny change might be > overkill. However, one could also argue that anything that is too trivial > to go through a FLIP should also be easy enough to quickly get through the > process. > > In this particular case, since you and Xuannan are working on another FLIP > regarding the usage of string-keys in configurations, why not make removing > of the @Deprecated annotation part of that FLIP? > > Best, > > Xintong > > > > On Wed, Dec 20, 2023 at 9:27 PM Rui Fan <1996fan...@gmail.com> wrote: > > > Thanks Xuannan and Xintong for the quick feedback! > > > > > However, we should let the user know that we encourage using > > ConfigOptions over the string-based > > > configuration key, as Timo said, we should add the message to `String > > > getString(String key, String defaultValue)` method. > > > > Sure, we can add some comments to guide users to use ConfigOption. > > > > If so, I will remove the @Deprecated annotation for > > `getString(String key, String defaultValue)` method`, and add > > some comments for it. > > > > Also, it's indeed a small change related to Public class(or Api), > > is voting necessary? > > > > Best, > > Rui > > > > On Wed, 20 Dec 2023 at 16:55, Xintong Song <tonysong...@gmail.com> > wrote: > > > > > Sounds good to me. > > > > > > Best, > > > > > > Xintong > > > > > > > > > > > > On Wed, Dec 20, 2023 at 9:40 AM Xuannan Su <suxuanna...@gmail.com> > > wrote: > > > > > > > Hi Rui, > > > > > > > > I am fine with keeping the `String getString(String key, String > > > > defaultValue)` if more people favor it. However, we should let the > > > > user know that we encourage using ConfigOptions over the string-based > > > > configuration key, as Timo said, we should add the message to `String > > > > getString(String key, String defaultValue)` method. > > > > > > > > Best, > > > > Xuannan > > > > > > > > On Tue, Dec 19, 2023 at 7:55 PM Rui Fan <1996fan...@gmail.com> > wrote: > > > > > > > > > > > > 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? > > > > > > > > > > Hi Xintong, thanks for the good suggestion! Most of the entries can > > be > > > > > serialized to a json string, and we can only write/read them at > once. > > > > > The CACHE_FILE_BLOB_KEY is special, its type is byte[], we need to > > > > > store it by the setBytes/getBytes. > > > > > > > > > > Also, I have an offline discussion with @Xuannan Su : refactoring > all > > > > code > > > > > that uses String as key requires a separate FLIP. And we will > provide > > > > > detailed FLIP later. > > > > > > > > > > > > > > > > > > > > -------------------------------------------------------------------------------------- > > > > > > > > > > Hi all, thanks everyone for the lively discussion. It's really a > > > > trade-off to > > > > > keep "String getString(String key, String defaultValue)" or not. > > > > > (It's not a right or wrong thing.) > > > > > > > > > > Judging from the discussion, most discussants can accept that > keeping > > > > > `String getString(String key, String defaultValue)` and depreate > the > > > > > rest of `getXxx(String key, Xxx defaultValue)`. > > > > > > > > > > cc @Xintong Song @Xuannan Su , WDYT? > > > > > > > > > > Best, > > > > > Rui > > > > > > > > > > On Fri, Dec 15, 2023 at 11:38 AM Zhu Zhu <reed...@gmail.com> > wrote: > > > > >> > > > > >> I think it's not clear whether forcing using ConfigOption would > hurt > > > > >> the user experience. > > > > >> > > > > >> Maybe it does at the beginning, because using string keys to > access > > > > >> Flink configuration can be simpler for new components/jobs. > > > > >> However, problems may happen later if the configuration usages > > become > > > > >> more complex, like key renaming, using types other than strings, > and > > > > >> other problems that ConfigOption was invented to address. > > > > >> > > > > >> Personally I prefer to encourage the usage of ConfigOption. > > > > >> Jobs should use GlobalJobParameter for custom config, which is > > > different > > > > >> from the Configuration interface. Therefore, Configuration is > mostly > > > > >> used in other components/plugins, in which case the long-term > > > > maintenance > > > > >> can be important. > > > > >> > > > > >> However, since it is not a right or wrong choice, I'd also be fine > > > > >> to keep the `getString()` method if more devs/users are in favor > of > > > it. > > > > >> > > > > >> Thanks, > > > > >> Zhu > > > > >> > > > > >> Timo Walther <twal...@apache.org> 于2023年12月14日周四 17:41写道: > > > > >> > > > > >> > The configuration in Flink is complicated and I fear we won't > have > > > > >> > enough capacity to substantially fix it. The introduction of > > > > >> > ReadableConfig, WritableConfig, and typed ConfigOptions was a > > right > > > > step > > > > >> > into making the code more maintainable. From the Flink side, > every > > > > read > > > > >> > access should go through ConfigOption. > > > > >> > > > > > >> > However, I also understand Gyula pragmatism here because > > > (practically > > > > >> > speaking) users get access `getString()` via `toMap().get()`. So > > I'm > > > > >> > fine with removing the deprecation for functionality that is > > > available > > > > >> > anyways. We should, however, add the message to `getString()` > that > > > > this > > > > >> > method is discouraged and `get(ConfigOption)` should be the > > > preferred > > > > >> > way of accessting Configuration. > > > > >> > > > > > >> > In any case we should remove the getInt and related methods. > > > > >> > > > > > >> > Cheers, > > > > >> > Timo > > > > >> > > > > > >> > > > > > >> > On 14.12.23 09:56, Gyula Fóra wrote: > > > > >> > > I see a strong value for user facing configs to use > ConfigOption > > > > and this > > > > >> > > should definitely be an enforced convention. > > > > >> > > > > > > >> > > However with the Flink project growing and many other > components > > > > and even > > > > >> > > users using the Configuration object I really don’t think that > > we > > > > should > > > > >> > > “force” this on the users/developers. > > > > >> > > > > > > >> > > If we make fromMap / toMap free with basically no overhead, > that > > > is > > > > fine > > > > >> > > but otherwise I think it would hurt the user experience to > > remove > > > > the > > > > >> > > simple getters / setters. Temporary configoptions to access > > > strings > > > > from > > > > >> > > what is practically string->string map is exactly the kind of > > > > unnecessary > > > > >> > > boilerplate that every dev and user wants to avoid. > > > > >> > > > > > > >> > > Gyula > > > > >> > > > > > > >> > > There are many cases where the features of the configoption > are > > > > really > > > > >> > not > > > > >> > > needed. > > > > >> > > > > > > >> > > On Thu, 14 Dec 2023 at 09:38, Xintong Song < > > tonysong...@gmail.com > > > > > > > > >> > wrote: > > > > >> > > > > > > >> > >> Hi Gyula, > > > > >> > >> > > > > >> > >> First of all, even if we remove the `getXXX(String key, XXX > > > > >> > defaultValue)` > > > > >> > >> methods, there are still several ways to access the > > configuration > > > > with > > > > >> > >> string-keys. > > > > >> > >> > > > > >> > >> - If one wants to access a specific option, as Rui > > mentioned, > > > > >> > >> `ConfigOptions.key("xxx").stringType().noDefaultValue()` > > can > > > be > > > > >> > used. > > > > >> > >> TBH, > > > > >> > >> I can't think of a use case where a temporally created > > > > ConfigOption > > > > >> > is > > > > >> > >> preferred over a predefined one. Do you have any examples > > for > > > > that? > > > > >> > >> - If one wants to access the whole configuration set, > then > > > > `toMap` > > > > >> > or > > > > >> > >> `iterator` might be helpful. > > > > >> > >> > > > > >> > >> It is true that these ways are less convenient than > > > `getXXX(String > > > > key, > > > > >> > XXX > > > > >> > >> defaultValue)`, and that's exactly my purpose, to make the > > > > key-string > > > > >> > less > > > > >> > >> convenient so that developers choose ConfigOption over it > > > whenever > > > > is > > > > >> > >> possible. > > > > >> > >> > > > > >> > >> there will always be cases where a more flexible > > > > >> > >>> dynamic handling is necessary without the added overhead of > > the > > > > toMap > > > > >> > >> logic > > > > >> > >>> > > > > >> > >> > > > > >> > >> I'm not sure about this. I agree there are cases where > flexible > > > and > > > > >> > dynamic > > > > >> > >> handling is needed, but maybe "without the added overhead of > > the > > > > toMap > > > > >> > >> logic" is not that necessary? > > > > >> > >> > > > > >> > >> I'd think of this as "encouraging developers to use > > ConfigOption > > > as > > > > >> > much as > > > > >> > >> possible" vs. "a bit less convenient in 5% of the cases". I > > guess > > > > >> > there's > > > > >> > >> no right and wrong, just different engineer opinions. While > I'm > > > > >> > personally > > > > >> > >> stand with removing the string-key access methods, I'd also > be > > > > fine with > > > > >> > >> the other way if there are more people in favor of it. > > > > >> > >> > > > > >> > >> Best, > > > > >> > >> > > > > >> > >> Xintong > > > > >> > >> > > > > >> > >> > > > > >> > >> > > > > >> > >> On Thu, Dec 14, 2023 at 3:45 PM Gyula Fóra < > > gyula.f...@gmail.com > > > > > > > > >> > wrote: > > > > >> > >> > > > > >> > >>> 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 > > > > >> > >>>>>>>>>>>>> > > > > >> > >>>>>>>>>>> > > > > >> > >>>>>>>>>> > > > > >> > >>>>>>> > > > > >> > >>>>>> > > > > >> > >>>>> > > > > >> > >>>> > > > > >> > >>> > > > > >> > >> > > > > >> > > > > > > >> > > > > > >> > > > > > > > > > > >