Hi all, Any additional questions or concern regarding this FLIP-389[1].? Looking forward to hearing from you.
Thanks, Hongshun Wang [1] https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=278465498 On Wed, Nov 22, 2023 at 3:44 PM Hongshun Wang <loserwang1...@gmail.com> wrote: > Hi Becket, > > Thanks a lot, I have no problem any more. And I have made further > modifications to FLIP-389[1]. > In summary, this flip has 2 goals: > > - Annotate SingleThreadFetcherManager as PublicEvolving. > - Shield FutureCompletingBlockingQueue from users and limit all > operations on FutureCompletingBlockingQueue in SplitFetcherManager. > > All the changes are listed below: > > - Mark constructor of SourceReaderBase and > SingleThreadMultiplexSourceReaderBase as @Depricated and provide a new > constructor without FutureCompletingBlockingQueue. > - Mark SplitFetcherManager andSingleThreadFetcherManager as > `@PublicEvolving`, mark constructor of SplitFetcherManager and > SingleThreadFetcherManager as @Depricated and provide a new constructor > without FutureCompletingBlockingQueue. > - SplitFetcherManager provides wrapper methods for > FutureCompletingBlockingQueue to replace its usage in SourceReaderBase. > - Mark SplitFetcher and SplitFetcherTask as PublicEvolving. > > > Any additional questions regarding this FLIP? Looking forward to hearing > from you. > > Thanks, > Hongshun Wang > > [1] > https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=278465498 > > > > > On Wed, Nov 22, 2023 at 10:15 AM Becket Qin <becket....@gmail.com> wrote: > >> Hi Hongshun, >> >> The constructor of the SplitFetcher is already package private. So it can >> only be accessed from the classes in the package >> org.apache.flink.connector.base.source.reader.fetcher. And apparently, >> user >> classes should not be in this package. Therefore, even if we mark the >> SplitFetcher class as PublicEvolving, the constructor is not available to >> the users. Only the public and protected methods are considered public API >> in this case. Private / package private methods and fields are still >> internal. >> >> Thanks, >> >> Jiangjie (Becket) Qin >> >> On Wed, Nov 22, 2023 at 9:46 AM Hongshun Wang <loserwang1...@gmail.com> >> wrote: >> >> > Hi Becket, >> > >> > If SplitFetcherManager becomes PublicEvolving, that also means >> SplitFetcher >> > > needs to be PublicEvolving, because it is returned by the protected >> > method >> > > SplitFetcherManager.createSplitFetcher(). >> > >> > >> > >> > > it looks like there is no need to expose the constructor of >> SplitFetcher >> > > to the end users. Having an interface of SplitFetcher is also fine, >> but >> > > might not be necessary in this case. >> > >> > >> > >> > I don't know how to make SplitFetcher as PublicEnvolving but not to >> expose >> > the constructor of SplitFetcher to the end users? >> > >> > Thanks, >> > Hongshun Wang >> > >> > On Tue, Nov 21, 2023 at 7:23 PM Becket Qin <becket....@gmail.com> >> wrote: >> > >> > > Hi Hongshun, >> > > >> > > Do we need to expose the constructor of SplitFetcher to the users? >> > Ideally, >> > > users should always get a new fetcher instance by calling >> > > SplitFetcherManager.createSplitFetcher(). Or, they can get an existing >> > > SplitFetcher by looking up in the SplitFetcherManager.fetchers map. I >> > think >> > > this makes sense because a SplitFetcher should always belong to a >> > > SplitFetcherManager. Therefore, it should be created via a >> > > SplitFetcherManager as well. So, it looks like there is no need to >> expose >> > > the constructor of SplitFetcher to the end users. >> > > >> > > Having an interface of SplitFetcher is also fine, but might not be >> > > necessary in this case. >> > > >> > > Thanks, >> > > >> > > Jiangjie (Becket) Qin >> > > >> > > On Tue, Nov 21, 2023 at 10:36 AM Hongshun Wang < >> loserwang1...@gmail.com> >> > > wrote: >> > > >> > > > Hi Becket, >> > > > >> > > > > Additionally, SplitFetcherTask requires >> FutureCompletingBlockingQueue >> > > as >> > > > a constructor parameter, which is not allowed now. >> > > > Sorry, it was my writing mistake. What I meant is that >> *SplitFetcher* >> > > > requires FutureCompletingBlockingQueue as a constructor parameter. >> > > > SplitFetcher >> > > > is a class rather than Interface. Therefore, I want to change >> > > > SplitFetcher to a public Interface and moving its implementation >> > > > details to an implement >> > > > subclass . >> > > > >> > > > Thanks, >> > > > Hongshun Wang >> > > > >> > > > On Fri, Nov 17, 2023 at 6:21 PM Becket Qin <becket....@gmail.com> >> > wrote: >> > > > >> > > > > Hi Hongshun, >> > > > > >> > > > > SplitFetcher.enqueueTask() returns void, right? SplitFetcherTask >> is >> > > > already >> > > > > an interface, and we need to make that as a PublicEvolving API as >> > well. >> > > > > >> > > > > So overall, a source developer can potentially do a few things in >> the >> > > > > SplitFetcherManager. >> > > > > 1. for customized logic including split-to-fetcher assignment, >> > > threading >> > > > > model, etc. >> > > > > 2. create their own SplitFetcherTask for the SplitFetcher / >> > SplitReader >> > > > to >> > > > > execute in a coordinated manner. >> > > > > >> > > > > It should be powerful enough for the vast majority of the source >> > > > > implementation, if not all. >> > > > > >> > > > > >> > > > > Additionally, SplitFetcherTask requires >> FutureCompletingBlockingQueue >> > > > > > as a >> > > > > > constructor parameter, which is not allowed >> > > > > > now. >> > > > > >> > > > > Are you referring to FetchTask which implements SplitFetcherTask? >> > That >> > > > > class will remain internal. >> > > > > >> > > > > Thanks, >> > > > > >> > > > > Jiangjie (Becket) Qin >> > > > > >> > > > > On Fri, Nov 17, 2023 at 5:23 PM Hongshun Wang < >> > loserwang1...@gmail.com >> > > > >> > > > > wrote: >> > > > > >> > > > > > Hi, Jiangjie(Becket) , >> > > > > > Thank you for your advice. I have learned a lot. >> > > > > > >> > > > > > If SplitFetcherManager becomes PublicEvolving, that also means >> > > > > > > SplitFetcher needs to be PublicEvolving, because it is >> returned >> > by >> > > > the >> > > > > > > protected method SplitFetcherManager.createSplitFetcher(). >> > > > > > >> > > > > > I completely agree with you. However, if SplitFetcher becomes >> > > > > > PublicEvolving, SplitFetcherTask also needs to be PublicEvolving >> > > > > > because it is returned by the public method >> > SplitFetcher#enqueueTask. >> > > > > > Additionally, SplitFetcherTask requires >> > FutureCompletingBlockingQueue >> > > > > > as a >> > > > > > constructor parameter, which is not allowed >> > > > > > now. Therefore, I propose changing SplitFetcher to a public >> > Interface >> > > > > > and moving its implementation details to an implement class >> (e.g., >> > > > > > SplitFetcherImpl or another suitable name). SplitFetcherImpl >> will >> > be >> > > > > > marked as internal and managed by SplitFetcherManager, >> > > > > > and put data in the queue. >> > > > > > Subclasses of SplitFetcherManager can only use the SplitFetcher >> > > > > interface, >> > > > > > also ensuring that the current subclasses are not affected. >> > > > > > >> > > > > > >> > > > > > >> > > > > > The current SplitFetcherManager basically looks up >> > > > > > > the SplitT from the fetcher with the split Id, and immediately >> > > passes >> > > > > the >> > > > > > > SplitT back to the fetcher, which is unnecessary. >> > > > > > >> > > > > > I inferred that this is because SplitReader#pauseOrResumeSplits >> > > > > > requires SplitT instead of SpiltId. Perhaps some external >> source >> > > > > > requires more information to pause. However, SplitReader doesn't >> > > store >> > > > > > all its split data, while SplitFetcherManager saves them. >> > > > > > CC, @Dawid Wysakowicz >> > > > > > >> > > > > > >> > > > > > >> > > > > > If not, SplitFetcher.pause() and >> > > > > > > SplitFetcher.resume() can be removed. In fact, they seem no >> > longer >> > > > used >> > > > > > > anywhere. >> > > > > > >> > > > > > It seems no use any more. CC, @Arvid Heise >> > > > > > >> > > > > > >> > > > > > >> > > > > > Thanks, >> > > > > > Hongshun Wang >> > > > > > >> > > > > > On Fri, Nov 17, 2023 at 11:42 AM Becket Qin < >> becket....@gmail.com> >> > > > > wrote: >> > > > > > >> > > > > > > Hi Hongshun, >> > > > > > > >> > > > > > > Thanks for updating the FLIP. I think that makes sense. A few >> > > > comments >> > > > > > > below: >> > > > > > > >> > > > > > > 1. If SplitFetcherManager becomes PublicEvolving, that also >> means >> > > > > > > SplitFetcher needs to be PublicEvolving, because it is >> returned >> > by >> > > > the >> > > > > > > protected method SplitFetcherManager.createSplitFetcher(). >> > > > > > > >> > > > > > > 2. When checking the API of the classes to be marked as >> > > > PublicEvolving, >> > > > > > > there might be a few methods' signatures worth some >> discussion. >> > > > > > > >> > > > > > > For SplitFetcherManager: >> > > > > > > a) Currently removeSplits() methods takes a list of SplitT. I >> am >> > > > > > wondering >> > > > > > > if it should be a list of splitIds. SplitT actually contains >> two >> > > > parts >> > > > > of >> > > > > > > information, the static split Id and some dynamically changing >> > > state >> > > > of >> > > > > > the >> > > > > > > split (e.g. Kafka consumer offset). The source of truth for >> the >> > > > dynamic >> > > > > > > state is SourceReaderBase. Currently we are passing in the >> full >> > > > source >> > > > > > > split with the dynamic state for split removal. But it looks >> like >> > > > only >> > > > > > > split id is needed for the split removal. >> > > > > > > Maybe this is intentional, as sometimes when a SplitReader >> > removes >> > > a >> > > > > > split, >> > > > > > > it also wants to know the dynamic state of the split. If so, >> we >> > can >> > > > > keep >> > > > > > it >> > > > > > > as is. But then the question is why >> > > > > > > SplitFetcherManager.pauseAndResumeSplits() only takes split >> ids >> > > > instead >> > > > > > of >> > > > > > > SplitT. Should we make them consistent? >> > > > > > > >> > > > > > > For SplitFetcher: >> > > > > > > a) The SplitFetcher.pauseOrResumeSplits() method takes >> > collections >> > > of >> > > > > > > SplitT as arguments. We may want to adjust that according to >> what >> > > we >> > > > do >> > > > > > to >> > > > > > > the SplitFetcherManager. The current SplitFetcherManager >> > basically >> > > > > looks >> > > > > > up >> > > > > > > the SplitT from the fetcher with the split Id, and immediately >> > > passes >> > > > > the >> > > > > > > SplitT back to the fetcher, which is unnecessary. >> > > > > > > b) After supporting split level pause and resume, do we still >> > need >> > > > > split >> > > > > > > fetcher level pause and resume? If not, SplitFetcher.pause() >> and >> > > > > > > SplitFetcher.resume() can be removed. In fact, they seem no >> > longer >> > > > used >> > > > > > > anywhere. >> > > > > > > >> > > > > > > Other than the above potential API adjustment before we mark >> the >> > > > > classes >> > > > > > > PublicEvolving, the API looks fine to me. >> > > > > > > >> > > > > > > I think it is good timing for deprecation now. We will mark >> the >> > > > > impacted >> > > > > > > constructors as deprecated in 1.19, and remove them in >> release of >> > > > 2.0. >> > > > > > > >> > > > > > > Thanks, >> > > > > > > >> > > > > > > Jiangjie (Becket) Qin >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > > On Thu, Nov 16, 2023 at 8:26 PM Hongshun Wang < >> > > > loserwang1...@gmail.com >> > > > > > >> > > > > > > wrote: >> > > > > > > >> > > > > > > > Hi Devs, >> > > > > > > > >> > > > > > > > I have just modified the content of FLIP-389: Annotate >> > > > > > > > SingleThreadFetcherManager as PublicEvolving[1]. >> > > > > > > > >> > > > > > > > Now this Flip mainly do two thing: >> > > > > > > > >> > > > > > > > 1. Annotate SingleThreadFetcherManager as PublicEvolving >> > > > > > > > 2. Remove all public constructors which use >> > > > > > > > FutureCompletingBlockingQueue. This will make many >> > > constructors >> > > > as >> > > > > > > > @Depricated. >> > > > > > > > >> > > > > > > > This may influence many connectors, so I am looking forward >> to >> > > > > hearing >> > > > > > > from >> > > > > > > > you. >> > > > > > > > >> > > > > > > > >> > > > > > > > Best regards, >> > > > > > > > Hongshun >> > > > > > > > >> > > > > > > > [1] >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=278465498 >> > > > > > > > >> > > > > > > > On Wed, Nov 15, 2023 at 7:57 AM Becket Qin < >> > becket....@gmail.com >> > > > >> > > > > > wrote: >> > > > > > > > >> > > > > > > > > Hi Hongshun, >> > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > > However, it will be tricky because SplitFetcherManager >> > > includes >> > > > > <E, >> > > > > > > > > SplitT >> > > > > > > > > > extends SourceSplit>, while >> FutureCompletingBlockingQueue >> > > > > includes >> > > > > > > <T>. >> > > > > > > > > > This means that SplitFetcherManager would have to be >> > modified >> > > > to >> > > > > > <T, >> > > > > > > E, >> > > > > > > > > > SplitT extends SourceSplit>, which would affect the >> > > > compatibility >> > > > > > of >> > > > > > > > the >> > > > > > > > > > SplitFetcherManager class. I'm afraid this change will >> > > > influence >> > > > > > > other >> > > > > > > > > > sources. >> > > > > > > > > >> > > > > > > > > Although the FutureCompletingBlockingQueue class itself >> has a >> > > > > > template >> > > > > > > > > class <T>. In the SourceReaderBase and >> SplitFetcherManager, >> > > this >> > > > > <T> >> > > > > > is >> > > > > > > > > actually RecordsWithSplitIds<E>. So it looks like we can >> just >> > > let >> > > > > > > > > SplitFetcherManager.poll() return a >> RecordsWithSplitIds<E>. >> > > > > > > > > >> > > > > > > > > Thanks, >> > > > > > > > > >> > > > > > > > > Jiangjie (Becket) Qin >> > > > > > > > > >> > > > > > > > > On Tue, Nov 14, 2023 at 8:11 PM Hongshun Wang < >> > > > > > loserwang1...@gmail.com >> > > > > > > > >> > > > > > > > > wrote: >> > > > > > > > > >> > > > > > > > > > Hi Becket, >> > > > > > > > > > I agree with you and try to modify this Flip[1], >> > which >> > > > > > include >> > > > > > > > > these >> > > > > > > > > > changes: >> > > > > > > > > > >> > > > > > > > > > 1. Mark constructor of >> > > SingleThreadMultiplexSourceReaderBase >> > > > > as >> > > > > > > > > > @Depricated >> > > > > > > > > > 2. >> > > > > > > > > > >> > > > > > > > > > Mark constructor of SourceReaderBase as *@Depricated* >> > and >> > > > > > provide >> > > > > > > a >> > > > > > > > > new >> > > > > > > > > > constructor without >> > > > > > > > > > >> > > > > > > > > > FutureCompletingBlockingQueue >> > > > > > > > > > 3. >> > > > > > > > > > >> > > > > > > > > > Mark constructor of SplitFetcherManager >> > > > > > > > andSingleThreadFetcherManager >> > > > > > > > > > as *@Depricated* and provide a new constructor >> > > > > > > > > > without FutureCompletingBlockingQueue. Mark >> > > > > SplitFetcherManager >> > > > > > > > > > andSingleThreadFetcherManager as *@PublicEvolving* >> > > > > > > > > > 4. >> > > > > > > > > > >> > > > > > > > > > SplitFetcherManager provides wrapper methods for >> > > > > > > > > > FutureCompletingBlockingQueue to replace its usage >> in >> > > > > > > > > SourceReaderBase. >> > > > > > > > > > Then we can use FutureCompletingBlockingQueue only in >> > > > > > > > > > SplitFetcherManager. >> > > > > > > > > > >> > > > > > > > > > However, it will be tricky because SplitFetcherManager >> > > includes >> > > > > <E, >> > > > > > > > > SplitT >> > > > > > > > > > extends SourceSplit>, while >> FutureCompletingBlockingQueue >> > > > > includes >> > > > > > > <T>. >> > > > > > > > > > This means that SplitFetcherManager would have to be >> > modified >> > > > to >> > > > > > <T, >> > > > > > > E, >> > > > > > > > > > SplitT extends SourceSplit>, which would affect the >> > > > compatibility >> > > > > > of >> > > > > > > > the >> > > > > > > > > > SplitFetcherManager class. I'm afraid this change will >> > > > influence >> > > > > > > other >> > > > > > > > > > sources. >> > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > > Looking forward to hearing from you. >> > > > > > > > > > >> > > > > > > > > > Best regards, >> > > > > > > > > > Hongshun >> > > > > > > > > > >> > > > > > > > > > [1] >> > > > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=278465498 >> > > > > > > > > > >> > > > > > > > > > On Sat, Nov 11, 2023 at 10:55 AM Becket Qin < >> > > > > becket....@gmail.com> >> > > > > > > > > wrote: >> > > > > > > > > > >> > > > > > > > > > > Hi Hongshun and Martijn, >> > > > > > > > > > > >> > > > > > > > > > > Sorry for the late reply as I was on travel and still >> > > > catching >> > > > > up >> > > > > > > > with >> > > > > > > > > > the >> > > > > > > > > > > emails. Please allow me to provide more context. >> > > > > > > > > > > >> > > > > > > > > > > 1. The original design of SplitFetcherManager and its >> > > > > subclasses >> > > > > > > was >> > > > > > > > to >> > > > > > > > > > > make them public to the Source developers. The goal >> is to >> > > let >> > > > > us >> > > > > > > take >> > > > > > > > > > care >> > > > > > > > > > > of the threading model, while the Source developers >> can >> > > just >> > > > > > focus >> > > > > > > on >> > > > > > > > > the >> > > > > > > > > > > SplitReader implementation. Therefore, I think making >> > > > > > > > > > SplitFetcherManater / >> > > > > > > > > > > SingleThreadFetcherManager public aligns with the >> > original >> > > > > > design. >> > > > > > > > That >> > > > > > > > > > is >> > > > > > > > > > > also why these classes are exposed in the constructor >> of >> > > > > > > > > > SourceReaderBase. >> > > > > > > > > > > >> > > > > > > > > > > 2. For FutureCompletingBlockingQueue, as a hindsight, >> it >> > > > might >> > > > > be >> > > > > > > > > better >> > > > > > > > > > to >> > > > > > > > > > > not expose it to the Source developers. They are >> unlikely >> > > to >> > > > > use >> > > > > > it >> > > > > > > > > > > anywhere other than just constructing it. The reason >> that >> > > > > > > > > > > FutureCompletingBlockingQueue is currently exposed in >> the >> > > > > > > > > > SourceReaderBase >> > > > > > > > > > > constructor is because both the SplitFetcherManager >> and >> > > > > > > > > SourceReaderBase >> > > > > > > > > > > need it. One way to hide the >> > FutureCompletingBlockingQueue >> > > > from >> > > > > > the >> > > > > > > > > > public >> > > > > > > > > > > API is to make SplitFetcherManager the only owner >> class >> > of >> > > > the >> > > > > > > queue, >> > > > > > > > > and >> > > > > > > > > > > expose some of its methods via SplitFetcherManager. >> This >> > > way, >> > > > > the >> > > > > > > > > > > SourceReaderBase can invoke the methods via >> > > > > SplitFetcherManager. >> > > > > > I >> > > > > > > > > > believe >> > > > > > > > > > > this also makes the code slightly cleaner. >> > > > > > > > > > > >> > > > > > > > > > > Thanks, >> > > > > > > > > > > >> > > > > > > > > > > Jiangjie (Becket) Qin >> > > > > > > > > > > >> > > > > > > > > > > On Fri, Nov 10, 2023 at 12:28 PM Hongshun Wang < >> > > > > > > > > loserwang1...@gmail.com> >> > > > > > > > > > > wrote: >> > > > > > > > > > > >> > > > > > > > > > > > @Martijn, I agree with you. >> > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > > > > I also have two questions at the beginning: >> > > > > > > > > > > > >> > > > > > > > > > > > - Why is an Internal class >> > > > > > > > > > > > exposed as a constructor param of a Public class? >> > > > > > > > > > > > - Should these classes be exposed as public? >> > > > > > > > > > > > >> > > > > > > > > > > > For the first question, I noticed that before the >> > > original >> > > > > > > > Jira[1] , >> > > > > > > > > > > > all these classes missed the annotate , so it was >> not >> > > > > abnormal >> > > > > > > that >> > > > > > > > > > > > FutureCompletingBlockingQueue and >> > > > SingleThreadFetcherManager >> > > > > > were >> > > > > > > > > > > > constructor params of >> > > > SingleThreadMultiplexSourceReaderBase. >> > > > > > > > > > > > However, >> > > > > > > > > > > > this jira marked FutureCompletingBlockingQueue and >> > > > > > > > > > > > SingleThreadFetcherManager as Internal, while marked >> > > > > > > > > > > > SingleThreadMultiplexSourceReaderBase as Public. >> It's a >> > > > good >> > > > > > > > choice, >> > > > > > > > > > > > but also forget that FutureCompletingBlockingQueue >> and >> > > > > > > > > > > > SingleThreadFetcherManager have already been >> exposed >> > by >> > > > > > > > > > > > SingleThreadMultiplexSourceReaderBase. >> > > > > > > > > > > > Thus, this problem occurs because we didn't >> > > > > > > > > > > > clearly define the boundaries at the origin design. >> We >> > > > should >> > > > > > pay >> > > > > > > > > more >> > > > > > > > > > > > attention to it when creating a new class. >> > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > > > > For the second question, I think at least >> > > > SplitFetcherManager >> > > > > > > > > > > > should be Public. There are few reasons: >> > > > > > > > > > > > >> > > > > > > > > > > > - Connector developers want to decide their own >> > > > > > > > > > > > thread mode. For example, Whether to recycle >> > fetchers >> > > by >> > > > > > > > > overriding >> > > > > > > > > > > > SplitFetcherManager#maybeShutdownFinishedFetchers >> > > > > > > > > > > > when idle. Sometimes, developers want >> > > > SplitFetcherManager >> > > > > > > react >> > > > > > > > > as a >> > > > > > > > > > > > FixedThreadPool, because >> > > > > > > > > > > > each time a thread is recycled then recreated, >> the >> > > > context >> > > > > > > > > > > > resources need to be rebuilt. I met a related issue >> in >> > > > flink >> > > > > > > > cdc[2]. >> > > > > > > > > > > > - >> > > > > > > > > > > > KafkaSourceFetcherManager[3] also extends >> > > > > > > > > > > > SingleThreadFetcherManager to commitOffsets. But now >> > > kafka >> > > > > > souce >> > > > > > > is >> > > > > > > > > > > > not in Flink repository, so it's not allowed any >> more. >> > > > > > > > > > > > >> > > > > > > > > > > > [1] >> https://issues.apache.org/jira/browse/FLINK-22358 >> > > > > > > > > > > > >> > > > > > > > > > > > [2] >> > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> https://github.com/ververica/flink-cdc-connectors/pull/2571#issuecomment-1797585418 >> > > > > > > > > > > > >> > > > > > > > > > > > [3] >> > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> https://github.com/apache/flink-connector-kafka/blob/979791c4c71e944c16c51419cf9a84aa1f8fea4c/flink-connector-kafka/src/main/java/org/apache/flink/connector/kafka/source/reader/fetcher/KafkaSourceFetcherManager.java#L52 >> > > > > > > > > > > > >> > > > > > > > > > > > Looking forward to hearing from you. >> > > > > > > > > > > > >> > > > > > > > > > > > Best regards, >> > > > > > > > > > > > Hongshun >> > > > > > > > > > > > >> > > > > > > > > > > > On Thu, Nov 9, 2023 at 11:46 PM Martijn Visser < >> > > > > > > > > > martijnvis...@apache.org >> > > > > > > > > > > > >> > > > > > > > > > > > wrote: >> > > > > > > > > > > > >> > > > > > > > > > > > > Hi all, >> > > > > > > > > > > > > >> > > > > > > > > > > > > I'm looking at the original Jira that introduced >> > these >> > > > > > > stability >> > > > > > > > > > > > > designations [1] and I'm just curious if it was >> > > intended >> > > > > that >> > > > > > > > these >> > > > > > > > > > > > > Internal classes would be used directly, or if we >> > just >> > > > > > haven't >> > > > > > > > > > created >> > > > > > > > > > > > > the right abstractions? The reason for asking is >> > > because >> > > > > > moving >> > > > > > > > > > > > > something from Internal to a public designation >> is an >> > > > easy >> > > > > > fix, >> > > > > > > > > but I >> > > > > > > > > > > > > want to make sure that it's also the right fix. >> If we >> > > are >> > > > > > > missing >> > > > > > > > > > good >> > > > > > > > > > > > > abstractions, then I would rather invest in those. >> > > > > > > > > > > > > >> > > > > > > > > > > > > Best regards, >> > > > > > > > > > > > > >> > > > > > > > > > > > > Martijn >> > > > > > > > > > > > > >> > > > > > > > > > > > > [1] >> > https://issues.apache.org/jira/browse/FLINK-22358 >> > > > > > > > > > > > > >> > > > > > > > > > > > > On Wed, Nov 8, 2023 at 12:40 PM Leonard Xu < >> > > > > > xbjt...@gmail.com> >> > > > > > > > > > wrote: >> > > > > > > > > > > > > > >> > > > > > > > > > > > > > Thanks Hongshun for starting this discussion. >> > > > > > > > > > > > > > >> > > > > > > > > > > > > > +1 from my side. >> > > > > > > > > > > > > > >> > > > > > > > > > > > > > IIRC, @Jiangjie(Becket) also mentioned this in >> > > > > FLINK-31324 >> > > > > > > > > > > comment[1]. >> > > > > > > > > > > > > > >> > > > > > > > > > > > > > Best, >> > > > > > > > > > > > > > Leonard >> > > > > > > > > > > > > > >> > > > > > > > > > > > > > [1] >> > > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> https://issues.apache.org/jira/browse/FLINK-31324?focusedCommentId=17696756&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-17696756 >> > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > > > > > > > > > 2023年11月8日 下午5:42,Hongshun Wang < >> > > > > loserwang1...@gmail.com >> > > > > > > >> > > > > > > > 写道: >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > Hi devs, >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > I would like to start a discussion on >> FLIP-389: >> > > > > Annotate >> > > > > > > > > > > > > > > SingleThreadFetcherManager and >> > > > > > > FutureCompletingBlockingQueue >> > > > > > > > as >> > > > > > > > > > > > > > > PublicEvolving.[ >> > > > > > > > > > > > > > > < >> > > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=278465498 >> > > > > > > > > > > > > > >> > > > > > > > > > > > > > > 1]. >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > Though the SingleThreadFetcherManager is >> > annotated >> > > as >> > > > > > > > Internal, >> > > > > > > > > > it >> > > > > > > > > > > > > actually >> > > > > > > > > > > > > > > acts as some-degree public API, which is >> widely >> > > used >> > > > in >> > > > > > > many >> > > > > > > > > > > > connector >> > > > > > > > > > > > > > > projects: flink-cdc-connector >> > > > > > > > > > > > > > > < >> > > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> https://github.com/ververica/flink-cdc-connectors/blob/release-2.3.0/flink-connector-mysql-cdc/src/main/java/com/ververica/cdc/connectors/mysql/source/reader/MySqlSourceReader.java#L93 >> > > > > > > > > > > > > > >> > > > > > > > > > > > > > > , flink-connector-mongodb >> > > > > > > > > > > > > > > < >> > > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> https://github.com/apache/flink-connector-mongodb/blob/main/flink-connector-mongodb/src/main/java/org/apache/flink/connector/mongodb/source/reader/MongoSourceReader.java#L58 >> > > > > > > > > > > > > > >> > > > > > > > > > > > > > > and >> > > > > > > > > > > > > > > soon. >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > Moreover, even the constructor of >> > > > > > > > > > > > SingleThreadMultiplexSourceReaderBase >> > > > > > > > > > > > > > > (which is PublicEvolving) includes the params >> of >> > > > > > > > > > > > > SingleThreadFetcherManager >> > > > > > > > > > > > > > > and FutureCompletingBlockingQueue. That means >> > that >> > > > the >> > > > > > > > > > > > > > > SingleThreadFetcherManager and >> > > > > > > FutureCompletingBlockingQueue >> > > > > > > > > > have >> > > > > > > > > > > > > already >> > > > > > > > > > > > > > > been exposed to users for a long time and are >> > > widely >> > > > > > used. >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > Considering that all source implementations >> are >> > > using >> > > > > > them >> > > > > > > de >> > > > > > > > > > > facto, >> > > > > > > > > > > > > why >> > > > > > > > > > > > > > > not annotate SingleThreadFetcherManager and >> > > > > > > > > > > > > FutureCompletingBlockingQueue >> > > > > > > > > > > > > > > as PublicEvolving so that developers will >> modify >> > it >> > > > > more >> > > > > > > > > > carefully >> > > > > > > > > > > to >> > > > > > > > > > > > > avoid >> > > > > > > > > > > > > > > any potential issues. As shown in >> > FLINK-31324[2], >> > > > > > > > > FLINK-28853[3] >> > > > > > > > > > > > used >> > > > > > > > > > > > > > > to change the default constructor of >> > > > > > > > > SingleThreadFetcherManager. >> > > > > > > > > > > > > However, >> > > > > > > > > > > > > > > it influenced a lot. Finally, the former >> > > constructor >> > > > > was >> > > > > > > > added >> > > > > > > > > > back >> > > > > > > > > > > > and >> > > > > > > > > > > > > > > marked as Deprecated。 >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > In conclusion, the goal of this FLIP is to >> > annotate >> > > > > > > > > > > > > > > SingleThreadFetcherManager(includes its parent >> > > class) >> > > > > and >> > > > > > > > > > > > > > > FutureCompletingBlockingQueue as >> PublicEvolving. >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > Looking forward to hearing from you. >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > [1] >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=278465498 >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > [2] >> > > > https://issues.apache.org/jira/browse/FLINK-31324 >> > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > [3] >> > > > https://issues.apache.org/jira/browse/FLINK-28853 >> > > > > > > > > > > > > > >> > > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> >