Thanks Peter and Marton for the quick response and fix, I’ve left +1 for this PR.
I’d like to take a look at followup FLIP-372 as well. Best, Leonard > 2023年12月12日 上午7:39,Becket Qin <becket....@gmail.com> 写道: > > Hi Peter, > > Thanks for updating the patch. The latest patch looks good to me. I've +1ed > on the PR. > > Cheers, > > Jiangjie (Becket) Qin > > On Mon, Dec 11, 2023 at 9:21 PM Péter Váry <peter.vary.apa...@gmail.com> > wrote: > >> Thanks everyone for the lively discussion! >> >> The PR is available which strictly adheres the accepted changes from >> FLIP-371. Thanks Gyula and Marton for the review. Becket, if you have any >> questions left, please let me know, so I can fix and we can merge the >> changes. >> >> I would like to invite everyone involved here to take a look at FLIP-372 >> [1], and the related mailing thread [2]. The discussion there is also at >> the stage where we are debating the merits of migrating to a mixin based >> Sink API. So if you are interested, please join us there. >> >> Thanks, >> Peter >> >> [1] - >> >> https://cwiki.apache.org/confluence/display/FLINK/FLIP-372%3A+Allow+TwoPhaseCommittingSink+WithPreCommitTopology+to+alter+the+type+of+the+Committable >> [2] - https://lists.apache.org/thread/344pzbrqbbb4w0sfj67km25msp7hxlyd >> >> >> On Tue, Dec 5, 2023, 18:05 Márton Balassi <balassi.mar...@gmail.com> >> wrote: >> >>> Thanks, Peter. Given the discussion I also agree that the consensus is to >>> move towards the mixin interface approach (and accept its disadvantages >>> given its advantages). >>> >>> +1 for the general direction of your proposed code change in >>> https://github.com/apache/flink/pull/23876. >>> >>> On Tue, Dec 5, 2023 at 3:44 PM Péter Váry <peter.vary.apa...@gmail.com> >>> wrote: >>> >>>> It seems to me we have a consensus to move forward with the mixin >>> approach. >>>> I hope that everyone is aware that with the mixin interfaces we lose >> the >>>> opportunity of the strong type checks. This will be especially painful >>> for >>>> generic types, where we will not have a way to ensure that the generic >>>> types are correctly synchronized between the different interfaces, even >>> on >>>> DAG creation time. >>>> >>>> Even with this drawback, I like this approach too, so +1 from my side. >>>> >>>> As a first step in the direction of the mixin approach, we can remove >> the >>>> specific implementations of the `createWriter` methods from the >>>> `StatefulSink` and the `TwoPhaseCommitingSink` interfaces (and replace >>> them >>>> with an instanceof check where needed). >>>> - This would remove the diamond inheritance - enable us to create >> default >>>> methods for backward compatibility. >>>> - This would not break the API, as the same method with wider return >>> value >>>> will be inherited from the `Sink` interface. >>>> >>>> Since, it might be easier to understand the proposed changes, I have >>>> created a new PR: https://github.com/apache/flink/pull/23876 >>>> The PR has 2 commits: >>>> - Reverting the previous change - non-clean, since there were some >>>> additional fixes on the tests - >>>> >>>> >>> >> https://github.com/apache/flink/pull/23876/commits/c7625d5fa62a6e9a182f39f53fb7e5626105f3b0 >>>> - The new change with mixin approach, and deprecation - >>>> >>>> >>> >> https://github.com/apache/flink/pull/23876/commits/99ec936966af527598ca49712c1263bc4aa03c15 >>>> >>>> Thanks, >>>> Peter >>>> >>>> weijie guo <guoweijieres...@gmail.com> ezt írta (időpont: 2023. dec. >> 5., >>>> K, >>>> 8:01): >>>> >>>>> Thanks Martijn for driving this! >>>>> >>>>> I'm +1 to reverting the breaking change. >>>>> >>>>>> For new functionality or changes we can make easily, we should >> switch >>>> to >>>>> the decorative/mixin interface approach used successfully in the >> source >>>> and >>>>> table interfaces. >>>>> >>>>> I like the way of switching to mixin interface. >>>>> >>>>> Best regards, >>>>> >>>>> Weijie >>>>> >>>>> >>>>> Becket Qin <becket....@gmail.com> 于2023年12月5日周二 14:50写道: >>>>> >>>>>> I am with Gyula about fixing the current SinkV2 API. >>>>>> >>>>>> A SinkV3 seems not necessary because we are not changing the >>>> fundamental >>>>>> design of the API. Hopefully we can modify the interface structure >> a >>>>> little >>>>>> bit to make it similar to the Source while still keep the backwards >>>>>> compatibility. >>>>>> For example, one approach is: >>>>>> >>>>>> - Add snapshotState(int checkpointId) and precommit() methods to >> the >>>>>> SinkWriter with default implementation doing nothing. Deprecate >>>>>> StatefulSinkWriter and PrecommittingSinkWriter. >>>>>> - Add two mixin interfaces of SupportsStatefulWrite and >>>>>> SupportsTwoPhaseCommit. Deprecate the StatefulSink and >>>>>> TwoPhaseCommittingSink. >>>>>> >>>>>> Thanks, >>>>>> >>>>>> Jiangjie (Becket) Qin >>>>>> >>>>>> On Mon, Dec 4, 2023 at 7:25 PM Gyula Fóra <gyula.f...@gmail.com> >>>> wrote: >>>>>> >>>>>>> Hi All! >>>>>>> >>>>>>> Based on the discussion above, I feel that the most reasonable >>>> approach >>>>>>> from both developers and users perspective at this point is what >>>> Becket >>>>>>> lists as Option 1: >>>>>>> >>>>>>> Revert the naming change to the backward compatible version and >>>> accept >>>>>> that >>>>>>> the names are not perfect (treat it as legacy). >>>>>>> >>>>>>> On a different note, I agree that the current sink v2 interface >> is >>>> very >>>>>>> difficult to evolve and structuring the interfaces the way they >> are >>>> now >>>>>> is >>>>>>> not a good design in the long run. >>>>>>> For new functionality or changes we can make easily, we should >>> switch >>>>> to >>>>>>> the decorative/mixin interface approach used successfully in the >>>> source >>>>>> and >>>>>>> table interfaces. Let's try to do this as much as possible within >>> the >>>>> v2 >>>>>>> and compatibility boundaries and we should only introduce a v3 if >>> we >>>>>> really >>>>>>> must. >>>>>>> >>>>>>> So from my side, +1 to reverting the naming to keep backward >>>>>> compatibility. >>>>>>> >>>>>>> Cheers, >>>>>>> Gyula >>>>>>> >>>>>>> >>>>>>> On Fri, Dec 1, 2023 at 10:43 AM Péter Váry < >>>>> peter.vary.apa...@gmail.com> >>>>>>> wrote: >>>>>>> >>>>>>>> Thanks Becket for your reply! >>>>>>>> >>>>>>>> *On Option 1:* >>>>>>>> - I personally consider API inconsistencies more important, >> since >>>>> they >>>>>>> will >>>>>>>> remain with us "forever", but this is up to the community. I >> can >>>>>>> implement >>>>>>>> whichever solution we decide upon. >>>>>>>> >>>>>>>> *Option 2:* >>>>>>>> - I don't think this specific issue merits a rewrite, but if we >>>>> decide >>>>>> to >>>>>>>> change our approach, then it's a different story. >>>>>>>> >>>>>>>> *Evolvability:* >>>>>>>> This discussion reminds me of a similar discussion on FLIP-372 >>> [1], >>>>>> where >>>>>>>> we are trying to decide if we should use mixin interfaces, or >> use >>>>>>> interface >>>>>>>> inheritance. >>>>>>>> With the mixin approach, we have a more flexible interface, but >>> we >>>>>> can't >>>>>>>> check the generic types of the interfaces/classes on compile >>> time, >>>> or >>>>>>> even >>>>>>>> when we create the DAG. The first issue happens when we call >> the >>>>> method >>>>>>> and >>>>>>>> fail. >>>>>>>> The issue here is similar: >>>>>>>> - *StatefulSink* needs a writer with a method to >>> `*snapshotState*` >>>>>>>> - *TwoPhaseCommittingSink* needs a writer with >> `*prepareCommit*` >>>>>>>> - If there is a Sink which is stateful and needs to commit, >> then >>> it >>>>>> needs >>>>>>>> both of these methods. >>>>>>>> >>>>>>>> If we use the mixin solution here, we lose the possibility to >>> check >>>>> the >>>>>>>> types in compile time. We could do the type check in runtime >>> using >>>> ` >>>>>>>> *instanceof*`, so we are better off than with the FLIP-372 >>> example >>>>>> above, >>>>>>>> but still lose any important possibility. I personally prefer >> the >>>>> mixin >>>>>>>> approach, but that would mean we rewrite the Sink API again - >>>> likely >>>>> a >>>>>>>> SinkV3. Are we ready to move down that path? >>>>>>>> >>>>>>>> Thanks, >>>>>>>> Peter >>>>>>>> >>>>>>>> [1] - >>>>> https://lists.apache.org/thread/344pzbrqbbb4w0sfj67km25msp7hxlyd >>>>>>>> >>>>>>>> On Thu, Nov 30, 2023, 14:53 Becket Qin <becket....@gmail.com> >>>> wrote: >>>>>>>> >>>>>>>>> Hi folks, >>>>>>>>> >>>>>>>>> Sorry for replying late on the thread. >>>>>>>>> >>>>>>>>> For this particular FLIP, I see two solutions: >>>>>>>>> >>>>>>>>> Option 1: >>>>>>>>> 1. On top of the the current status, rename >>>>>>>>> *org.apache.flink.api.connector.sink2.InitContext *to >>>>>>>>> *CommonInitContext (*should >>>>>>>>> probably be package private*)*. >>>>>>>>> 2. Change the name *WriterInitContext* back to *InitContext, >>> *and >>>>>>> revert >>>>>>>>> the deprecation. We can change the parameter name to >>>> writerContext >>>>> if >>>>>>> we >>>>>>>>> want to. >>>>>>>>> Admittedly, this does not have full symmetric naming of the >>>>>>> InitContexts >>>>>>>> - >>>>>>>>> we will have CommonInitContext / InitContext / >>>> CommitterInitContext >>>>>>>> instead >>>>>>>>> of InitContext / WriterInitContext / CommitterInitContext. >>>> However, >>>>>> the >>>>>>>>> naming seems clear without much confusion. Personally, I can >>> live >>>>>> with >>>>>>>>> that, treating the class InitContext as a non-ideal legacy >>> class >>>>> name >>>>>>>>> without much material harm. >>>>>>>>> >>>>>>>>> Option 2: >>>>>>>>> Theoretically speaking, if we really want to reach the >> perfect >>>>> state >>>>>>>> while >>>>>>>>> being backwards compatible, we can create a brand new set of >>> Sink >>>>>>>>> interfaces and deprecate the old ones. But I feel this is an >>>>> overkill >>>>>>>> here. >>>>>>>>> >>>>>>>>> The solution to this particular issue aside, the evolvability >>> of >>>>> the >>>>>>>>> current interface hierarchy seems a more fundamental issue >> and >>>>>> worries >>>>>>> me >>>>>>>>> more. I haven't completely thought it through, but there are >>> two >>>>>>>> noticeable >>>>>>>>> differences between the interface design principles between >>>> Source >>>>>> and >>>>>>>>> Sink. >>>>>>>>> 1. Source uses decorative interfaces. For example, we have a >>>>>>>>> SupportsFilterPushdown interface, instead of a subclass of >>>>>>>>> FilterableSource. This seems provides better flexibility. >>>>>>>>> 2. Source tends to have a more coarse-grained interface. For >>>>> example, >>>>>>>>> SourceReader always has the methods of snapshotState(), >>>>>>>>> notifyCheckpointComplete(). Even if they may not be always >>>>> required, >>>>>> we >>>>>>>> do >>>>>>>>> not separate them into different interfaces. >>>>>>>>> My hunch is that if we follow similar approach as Source, the >>>>>>>> evolvability >>>>>>>>> might be better. If we want to do this, we'd better to do it >>>> before >>>>>>> 2.0. >>>>>>>>> What do you think? >>>>>>>>> >>>>>>>>> Process wise, >>>>>>>>> - I agree that if there is a change to the passed FLIP during >>>>>>>>> implementation, it should be brought back to the mailing >> list. >>>>>>>>> - There might be value for the connector nightly build to >>> depend >>>> on >>>>>> the >>>>>>>>> latest snapshot of the same Flink major version. It helps >>>> catching >>>>>>>>> unexpected breaking changes sooner. >>>>>>>>> - I'll update the website to reflect the latest API stability >>>>> policy. >>>>>>>>> Apologies for the confusion caused by the stale doc. >>>>>>>>> >>>>>>>>> Thanks, >>>>>>>>> >>>>>>>>> Jiangjie (Becket) Qin >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On Wed, Nov 29, 2023 at 10:55 PM Márton Balassi < >>>>>>>> balassi.mar...@gmail.com> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>>> Thanks, Martijn and Peter. >>>>>>>>>> >>>>>>>>>> In terms of the concrete issue: >>>>>>>>>> >>>>>>>>>> - I am following up with the author of FLIP-321 [1] >>> (Becket) >>>>> to >>>>>>>> update >>>>>>>>>> the docs [2] to reflect the right state. >>>>>>>>>> - I see two reasonable approaches in terms of proceeding >>>> with >>>>>> the >>>>>>>>>> specific changeset: >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> 1. We allow the exception from FLIP-321 for this change >>> and >>>>> let >>>>>>> the >>>>>>>>>> PublicEvolving API change happen between Flink 1.18 >> and >>>>> 1.19, >>>>>>>> which >>>>>>>>>> is >>>>>>>>>> consistent with current state of the relevant >>>>> documentation. >>>>>>> [2] >>>>>>>>>> We commit >>>>>>>>>> to helping the connector repos make the necessary >> (one >>>>> liner) >>>>>>>>>> changes. >>>>>>>>>> 2. We revert back to the original implementation plan >>> as >>>>>>>> explicitly >>>>>>>>>> voted on in FLIP-371 [3]. That has no API breaking >>>> changes. >>>>>>>>>> However we end >>>>>>>>>> up with an inconsistently named API with duplicated >>>>> internal >>>>>>>>>> methods. Peter >>>>>>>>>> has also discovered additional bad patterns during >> his >>>> work >>>>>> in >>>>>>>>>> FLIP-372 >>>>>>>>>> [3], the total of these changes could be handled in a >>>>>> separate >>>>>>>> FLIP >>>>>>>>>> that >>>>>>>>>> would do multiple PublicEvolving breaking changes to >>>> clean >>>>> up >>>>>>> the >>>>>>>>>> API. >>>>>>>>>> >>>>>>>>>> In terms of the general issues: >>>>>>>>>> >>>>>>>>>> - I agree that if a PR review of an accepted FLIP newly >>>>>>> introduces a >>>>>>>>>> breaking API change that warrants an update to the >> mailing >>>>> list >>>>>>>>>> discussion >>>>>>>>>> and possibly even a new vote. >>>>>>>>>> - I agree with the general sentiment of FLIP-321 to >>> provide >>>>>>> stronger >>>>>>>>> API >>>>>>>>>> guarantees with the minor note that if we have changes >> in >>>> mind >>>>>> we >>>>>>>>> should >>>>>>>>>> prioritize them now such that they can be validated by >>> Flink >>>>>> 2.0. >>>>>>>>>> - I agree that ideally the connector repos should build >>>>> against >>>>>>> the >>>>>>>>>> latest release and not the master branch. >>>>>>>>>> >>>>>>>>>> [1] >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> https://cwiki.apache.org/confluence/display/FLINK/FLIP-321%3A+Introduce+an+API+deprecation+process >>>>>>>>>> [2] >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> https://nightlies.apache.org/flink/flink-docs-master/docs/ops/upgrading/#api-compatibility-guarantees >>>>>>>>>> [3] >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> https://cwiki.apache.org/confluence/display/FLINK/FLIP-371%3A+Provide+initialization+context+for+Committer+creation+in+TwoPhaseCommittingSink >>>>>>>>>> [4] >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> https://cwiki.apache.org/confluence/display/FLINK/FLIP-372%3A+Allow+TwoPhaseCommittingSink+WithPreCommitTopology+to+alter+the+type+of+the+Committable >>>>>>>>>> >>>>>>>>>> Best, >>>>>>>>>> Marton >>>>>>>>>> >>>>>>>>>> On Mon, Nov 27, 2023 at 7:23 PM Péter Váry < >>>>>>>> peter.vary.apa...@gmail.com> >>>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>>> I think we should try to separate the discussion in a few >>>>>> different >>>>>>>>>> topics: >>>>>>>>>>> >>>>>>>>>>> - Concrete issue >>>>>>>>>>> - How to solve this problem in 1.19 and wrt the >>>> affected >>>>>>>>>> createWriter >>>>>>>>>>> interface >>>>>>>>>>> - Update the documentation [1], so FLIP-321 is >>> visible >>>>> for >>>>>>>> every >>>>>>>>>>> contributor >>>>>>>>>>> - Generic issue >>>>>>>>>>> - API stability >>>>>>>>>>> - Connector dependencies >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> *CreateWriter interface* >>>>>>>>>>> The change on the createWriter is not strictly required >> for >>>> the >>>>>>>>>>> functionality defined by the requirements on the FLIP. >>>>>>>>>>> If the only goal is only to have a backward compatible >> API, >>>> we >>>>>> can >>>>>>>>> simply >>>>>>>>>>> create a separate `*CommitterInitContext*` object and do >>> not >>>>>> touch >>>>>>>> the >>>>>>>>>>> writer `*InitContext*`, like it was done in the original >> PR >>>>> [2]. >>>>>>>>>>> The issue is that this would result in an implementation >>>> which >>>>>> has >>>>>>>>>>> duplicated methods/implementations (internal issue only), >>> and >>>>> has >>>>>>>>>>> inconsistent naming (issue for external users). >>>>>>>>>>> >>>>>>>>>>> If we want to create an API which is consistent (and I >>> agree >>>>> with >>>>>>> the >>>>>>>>>>> reviewer's comments), then we need to rename the >> parameter >>>>> type ( >>>>>>>>>>> *WriterInitContext*) for the createWriter method. >>>>>>>>>>> I have tried to keep the backward compatibility with >>>> creating a >>>>>> new >>>>>>>>>> method >>>>>>>>>>> and providing a default implementation for this new >> method >>>>> which >>>>>>>> would >>>>>>>>>> call >>>>>>>>>>> the original method after converting the >> WriterInitContext >>> to >>>>>>>>>> InitContext. >>>>>>>>>>> >>>>>>>>>>> This is failed because the following details: >>>>>>>>>>> >>>>>>>>>>> - *org.apache.flink.api.connector.sink2.Sink* defines >>>>>>>>>>> `*SinkWriter<InputT> >>>>>>>>>>> createWriter(InitContext context)`* >>>>>>>>>>> - *org.apache.flink.api.connector.sink2.StatefulSink* >>>>> narrows >>>>>> it >>>>>>>>>>> down to *`StatefulSinkWriter<InputT, >>>>>>>>>>> WriterStateT> createWriter(InitContext context)`* >>>>>>>>>>> - >>>>>> *org.apache.flink.api.connector.sink2.TwoPhaseCommittingSink* >>>>>>>>>> narrows >>>>>>>>>>> it down to *`PrecommittingSinkWriter<InputT, CommT> >>>>>>>>>>> createWriter(WriterInitContext context)`* >>>>>>>>>>> - >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> *org.apache.flink.streaming.runtime.operators.sink.TestSinkV2.TestStatefulSinkV2* >>>>>>>>>>> implements *StatefulSink* and *TwoPhaseCommittingSink* >>> too >>>>>>>>>>> >>>>>>>>>>> *TestStatefulSinkV2* is a good example where we can not >>>> achieve >>>>>>>>> backward >>>>>>>>>>> compatibility, since the the compiler will fail with >>>> unrelated >>>>>>>> default >>>>>>>>>>> methods [3] >>>>>>>>>>> >>>>>>>>>>> I am open for any suggestions how to move to the new API, >>> and >>>>>> keep >>>>>>>> the >>>>>>>>>>> backward compatibility. If we do not find a way to keep >>>>> backward >>>>>>>>>>> compatibility, and we decide that we would like to honour >>>>>> FLIP-321, >>>>>>>>> then >>>>>>>>>> we >>>>>>>>>>> can reverting to the original solution and keep only the >>>>> changes >>>>>>> for >>>>>>>>> the >>>>>>>>>> ` >>>>>>>>>>> *createCommitter*` method. >>>>>>>>>>> >>>>>>>>>>> *Update the documentation* >>>>>>>>>>> I have not found only one place in the docs [1], where we >>>> talk >>>>>>> about >>>>>>>>> the >>>>>>>>>>> compatibility guarantees. >>>>>>>>>>> Based FLIP-321 and the result of the discussion here, we >>>> should >>>>>>>> update >>>>>>>>>> this >>>>>>>>>>> page. >>>>>>>>>>> >>>>>>>>>>> *API stability* >>>>>>>>>>> I agree with the general sentiment of FLIP-321 to keep >> the >>>>>> changes >>>>>>>>>> backward >>>>>>>>>>> compatible as much as possible. But the issue above >>>> highlights >>>>>> that >>>>>>>>> there >>>>>>>>>>> could be situations where it is not possible to achieve >>>>> backward >>>>>>>>>>> compatibility. Probably we should provide exceptions to >>>> handle >>>>>> this >>>>>>>>> kind >>>>>>>>>> of >>>>>>>>>>> situations - minimally for PublicEvolving interfaces. >> After >>>> we >>>>>>> agree >>>>>>>> on >>>>>>>>>>> long term goals - allowing exceptions or to be more >> lenient >>>> on >>>>>>>> backward >>>>>>>>>>> compatibility guarantees, or sticking to FLIP-321 by the >>>>> letter - >>>>>>> we >>>>>>>>>> could >>>>>>>>>>> discuss how to apply it to the current situation. >>>>>>>>>>> >>>>>>>>>>> *Connector dependencies* >>>>>>>>>>> I think it is generally a good practice to depend on the >>>> stable >>>>>>>> version >>>>>>>>>> of >>>>>>>>>>> Flink (or any other downstream project). This is how we >> do >>> it >>>>> in >>>>>>>>> Iceberg, >>>>>>>>>>> and how it was implemented in the Kafka connector as >> well. >>>> This >>>>>>> would >>>>>>>>>>> result in more stable connector builds. The only issue I >>> see, >>>>>> that >>>>>>>> the >>>>>>>>>>> situations like this would take longer to surface, but I >>>> fully >>>>>>> expect >>>>>>>>> us >>>>>>>>>> to >>>>>>>>>>> get better at compatibility after we wetted the process. >>>>>>>>>>> >>>>>>>>>>> [1] - >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> https://nightlies.apache.org/flink/flink-docs-master/docs/ops/upgrading/#api-compatibility-guarantees >>>>>>>>>>> [2] - >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> https://github.com/apache/flink/pull/23555/commits/2b9adeb20e55c33a623115efa97d3149c11e9ca4 >>>>>>>>>>> [3] - >>>>>>>>> >>>> https://github.com/apache/flink/pull/23555#discussion_r1371740397 >>>>>>>>>>> >>>>>>>>>>> Martijn Visser <martijnvis...@apache.org> ezt írta >>> (időpont: >>>>>> 2023. >>>>>>>>> nov. >>>>>>>>>>> 27., H, 11:21): >>>>>>>>>>> >>>>>>>>>>>> Hi all, >>>>>>>>>>>> >>>>>>>>>>>> I'm opening this discussion thread to bring a >> discussion >>>>> that's >>>>>>>>>>>> happening on a completed Jira ticket back to the >> mailing >>>> list >>>>>> [1] >>>>>>>>>>>> >>>>>>>>>>>> In summary: >>>>>>>>>>>> >>>>>>>>>>>> * There was a discussion and a vote on FLIP-371 [2] >>>>>>>>>>>> * During implementation, it was determined that >> there's a >>>>>> diamond >>>>>>>>>>>> inheritance problem on the Sink.createWriter method, >>>> making a >>>>>>>>>>>> backwards compatible change hard/impossible (I think >> this >>>> is >>>>>>> where >>>>>>>>> the >>>>>>>>>>>> main discussion point actually is) [3] >>>>>>>>>>>> * The PR was merged, causing a backwards incompatible >>>> change >>>>>>>> without >>>>>>>>> a >>>>>>>>>>>> discussion on the Dev mailing list >>>>>>>>>>>> >>>>>>>>>>>> I think that in hindsight, even though there was a FLIP >>> on >>>>> this >>>>>>>>> topic, >>>>>>>>>>>> the finding of the diamond inheritance issue should >> have >>>> been >>>>>>>> brought >>>>>>>>>>>> back to the Dev mailing list in order to agree on how >> to >>>>>> resolve >>>>>>>> it. >>>>>>>>>>>> Since 1.19 is still under way, we still have time to >> fix >>>>> this. >>>>>>>>>>>> >>>>>>>>>>>> I think there's two things we can improve: >>>>>>>>>>>> >>>>>>>>>>>> 1) Next time during implementation of a FLIP/PR which >>>>> involves >>>>>> a >>>>>>>>>>>> non-backward compatible change of an API that wasn't >>>>> accounted >>>>>>> for, >>>>>>>>>>>> the discussion should be brought back to the Dev >> mailing >>>>> list. >>>>>> I >>>>>>>>> think >>>>>>>>>>>> we can just add that to the FLIP bylaws. >>>>>>>>>>>> 2) How do we actually resolve the problem: is there >>> anyone >>>>> who >>>>>>> has >>>>>>>> an >>>>>>>>>>>> idea on how we could introduce the proposed change >> while >>>>>>>> maintaining >>>>>>>>>>>> backwards compatibility, or do we agree that while this >>> is >>>> an >>>>>> non >>>>>>>>>>>> desired situation, there is no better alternative >>>>>> unfortunately? >>>>>>>>>>>> >>>>>>>>>>>> Best regards, >>>>>>>>>>>> >>>>>>>>>>>> Martijn >>>>>>>>>>>> >>>>>>>>>>>> [1] https://issues.apache.org/jira/browse/FLINK-25857 >>>>>>>>>>>> [2] >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> https://cwiki.apache.org/confluence/display/FLINK/FLIP-371%3A+Provide+initialization+context+for+Committer+creation+in+TwoPhaseCommittingSink >>>>>>>>>>>> [3] >>>>>>>>> >>>> https://github.com/apache/flink/pull/23555#discussion_r1371740397 >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >>