Hi Xuannan, Thanks for your comments!
1. The name `emptyFuture` seems a little unintuitive, and it is hard > to understand in what use case the `emptyFuture` should be used. If I > understand correctly, it is similar to the > FutureUtils#completedVoidFuture. How about naming it > completedVoidStateFuture? It will be used in callback chaining cases where some branch within one callback does nothing. I'm in favor of short phrases to express the functionalities. Thus I suggest `completedVoidFuture` or `voidFuture`, WDTY? 2. IIUC, the `FutureUtils` is intended to be used by the user. If > that's the case, `FutureUtils` should be annotated as a public > interface, such as `PublicEvolving`. > Yes I missed that, thanks for the reminder. 3. The state classes, such as `ValueState`, `ListState`, etc., are > essential for users, and we should add JavaDocs to those classes and > their methods. Yes, this will be added in implementation, I just omitted them for easy reading. Thanks & Best, Zakelly On Mon, Mar 11, 2024 at 5:25 PM Zakelly Lan <zakelly....@gmail.com> wrote: > Hi Yunfeng, > > Thanks for your comments! > > +1 for JingGe's suggestion to introduce an AsyncState API, instead of >> having both get() and asyncGet() in the same State class. As a >> supplement to its benefits, this design could help avoid having users >> to use sync and async API in a mixed way (unless they create both a >> State and an AsyncState from the same state descriptor), which is >> supposed to bring suboptimal performance according to the FLIP's >> description. > > > Actually splitting APIs into two sets of classes also brings some > difficulties. In this case, users must explicitly define their usage before > actually doing state access. It is a little strange that the user can > define a sync and an async version of State with the same name, while they > cannot allocate two async States with the same name. > Another reason for distinguishing API by their method name instead of > class name is that users typically use the State instances to access state > but forget their type/class. For example: > ``` > SyncState a = getState(xxx); > AsyncState b = getAsyncState(xxx); > //... > a.update(1); > b.update(1); > ``` > Users are likely to think there is no difference between the `a.update(1)` > and `b.update(1)`, since they may forget the type for `a` and `b`. Thus I > proposed to distinguish the behavior in method names. > As for the suboptimal performance with mixed usage of sync and async, my > proposal is to warn them in runtime. > > I noticed that the FLIP proposes to place the newly introduced API in >> the package "org.apache.flink.api.common.state.v2", which seems a >> little strange to me as there has not been such a naming pattern >> ".v2." for packages in Flink. > > > In fact, there are some similar existing patterns, like > `org.apache.flink.streaming.api.functions.sink.v2` and > `org.apache.flink.streaming.api.connector.sink2`. > > I would suggest discussing this topic >> with the main authors of Datastream V2, like Weijie Guo, so that the >> newly introduced APIs from both sides comply with a unified naming >> style. > > I'm afraid we are facing a different situation with the Datastream V2. For > total reconstruction of Datastream API, it is big enough to build a > seperate module and keep good package names. While for state APIs, we > should stay in the flink-core(-api) module alongside with other > apis, currently I tend to compromise at the expense of naming style. > > > Looking forward to hearing from you again! > > Thanks & Best, > Zakelly > > On Mon, Mar 11, 2024 at 4:20 PM Yunfeng Zhou <flink.zhouyunf...@gmail.com> > wrote: > >> Hi Zakelly, >> >> Thanks for the proposal! The structure of the Async API generally >> looks good to me. Some comments on the details of the design are as >> follows. >> >> +1 for JingGe's suggestion to introduce an AsyncState API, instead of >> having both get() and asyncGet() in the same State class. As a >> supplement to its benefits, this design could help avoid having users >> to use sync and async API in a mixed way (unless they create both a >> State and an AsyncState from the same state descriptor), which is >> supposed to bring suboptimal performance according to the FLIP's >> description. >> >> I noticed that the FLIP proposes to place the newly introduced API in >> the package "org.apache.flink.api.common.state.v2", which seems a >> little strange to me as there has not been such a naming pattern >> ".v2." for packages in Flink. I would suggest discussing this topic >> with the main authors of Datastream V2, like Weijie Guo, so that the >> newly introduced APIs from both sides comply with a unified naming >> style. If we reach an agreement on the first comment, my personal idea >> is that we can place the AsyncState interfaces to >> "org.apache.flink.api.common.state.async", and the existing state APIs >> to "org.apache.flink.api.common.state" or >> "org.apache.flink.api.common.state.sync". >> >> Best regards, >> Yunfeng Zhou >> >> On Thu, Mar 7, 2024 at 4:48 PM Zakelly Lan <zakelly....@gmail.com> wrote: >> > >> > Hi devs, >> > >> > I'd like to start a discussion on a sub-FLIP of FLIP-423: Disaggregated >> > State Storage and Management[1], which is a joint work of Yuan Mei, >> Zakelly >> > Lan, Jinzhong Li, Hangxiang Yu, Yanfei Lei and Feng Wang: >> > >> > - FLIP-424: Asynchronous State APIs [2] >> > >> > This FLIP introduces new APIs for asynchronous state access. >> > >> > Please make sure you have read the FLIP-423[1] to know the whole story, >> and >> > we'll discuss the details of FLIP-424[2] under this mail. For the >> > discussion of overall architecture or topics related with multiple >> > sub-FLIPs, please post in the previous mail[3]. >> > >> > Looking forward to hearing from you! >> > >> > [1] https://cwiki.apache.org/confluence/x/R4p3EQ >> > [2] https://cwiki.apache.org/confluence/x/SYp3EQ >> > [3] https://lists.apache.org/thread/ct8smn6g9y0b8730z7rp9zfpnwmj8vf0 >> > >> > >> > Best, >> > Zakelly >> >