Hi Becket,

Thanks for the reply! I’d like to continue the conversation about compatibility 
outside of this FLIP thread, but for now, I can accept your decision. It’s 
certainly an improvement. 

Thanks again,
John

On Sun, Jun 18, 2023, at 21:42, Becket Qin wrote:
> Hi John,
>
> Completely agree with all you said.
>
> Can we consider only dropping deprecated APIs in major releases across the
>> board? I understand that Experimental and PublicEvolving APIs are by
>> definition less stable, but it seems like this should be reflected in the
>> required deprecation period alone. I.e. that we must keep them around for
>> at least zero or one minor release, not that we can drop them in a minor or
>> patch release.
>
> Personally speaking, I would love to do this, for exactly the reason you
> mentioned. However, I did not propose this due to the following reasons:
>
> 1. I am hesitating a little bit about changing the accepted FLIPs too soon.
> 2. More importantly, to avoid slowing down our development. At this point,
> Flink still lacks some design / routines to support good API evolvability /
> extensibility. Just like you said, it takes some time to be good at this.
> In this case, my concern is that only removing Experimental /
> PublicEvolving APIs in major version changes may result in too much
> overhead and dramatically slow down the development of Flink. So, I was
> thinking that we can start with the current status. Hopefully after we are
> more comfortable with the maintenance overhead of deprecated APIs, we can
> then have a stronger guarantee for Experimental / PublicEvolving APIs.
>
> Thanks,
>
> Jiangjie (Becket) Qin
>
>
>
> On Sun, Jun 18, 2023 at 6:44 AM John Roesler <vvcep...@apache.org> wrote:
>
>> Hi Becket,
>>
>> Thanks for this FLIP! Having a deprecation process is really important. I
>> understand some people’s concerns about the additional burden for project
>> maintainers, but my personal experience with Kafka has been that it’s very
>> liveable and that it’s well worth the benefit to users. In fact, users
>> being able to confidently upgrade is also a benefit to maintainers, as we
>> will get fewer questions from people stuck on very old versions.
>>
>> One question:
>> Can we consider only dropping deprecated APIs in major releases across the
>> board? I understand that Experimental and PublicEvolving APIs are by
>> definition less stable, but it seems like this should be reflected in the
>> required deprecation period alone. I.e. that we must keep them around for
>> at least zero or one minor release, not that we can drop them in a minor or
>> patch release.
>>
>> The advantage of forbidding the removal of any API in minor or patch
>> releases is that users will get a strong guarantee that they can bump the
>> minor or patch version and still be able to compile, or even just re-link
>> and know that they won’t face “MethodDef” exceptions at run time. This is a
>> binary guarantee: if we allow removing  even Experimental APIs outside of
>> major releases, users can no longer confidently upgrade.
>>
>> Aside from that, I’d share my 2 cents on a couple of points:
>> * I’d use the official Deprecated annotation instead of introducing our
>> own flavor (Retired, etc), since Deprecated is well integrated into build
>> tools and IDEs.
>> * I wouldn’t worry about a demotion process in this FLIP; it seems
>> orthogonal, and something that should probably be taken case-by-case
>> anyway.
>> * Aside from deprecation and removal, there have been some discussions
>> about how to evolve APIs and behavior in compatible ways. This is somewhat
>> of an art, and if folks haven’t wrestled with it before, it’ll take some
>> time to become good at it. I feel like this topic should also be orthogonal
>> to this FLIP, but FWIW, my suggestion would be to adopt a simple policy not
>> to break existing user programs, and leave the “how” up to implementers and
>> reviewers.
>>
>> Thanks again,
>> John
>>
>> On Sat, Jun 17, 2023, at 11:03, Jing Ge wrote:
>> > Hi All,
>> >
>> > The @Public -> @PublicEvolving proposed by Xintong is a great idea.
>> > Especially, after he suggest @PublicRetired, i.e. @PublicEvolving --(2
>> > minor release)--> @Public --> @deprecated --(1 major
>> > release)--> @PublicRetired. It will provide a lot of flexibility without
>> > breaking any rules we had. @Public APIs are allowed to change between
>> major
>> > releases. Changing annotations is acceptable and provides additional
>> > tolerance i.e. user-friendliness, since the APIs themself are not
>> changed.
>> >
>> > I had similar thoughts when I was facing those issues. I want to move one
>> > step further and suggest introducing one more annotation @Retired.
>> >
>> > Not like the @PublicRetired which is a compromise of downgrading @Public
>> to
>> > @PublicEvolving. As I mentioned earlier in my reply, Java standard
>> > @deprecated should be used in the early stage of the deprecation process
>> > and doesn't really meet our requirement. Since Java does not allow us to
>> > extend annotation, I think it would be feasible to have the new @Retired
>> to
>> > help us monitor and manage the deprecation process, house cleaning, etc.
>> >
>> > Some ideas could be(open for discussion):
>> >
>> > @Retired:
>> >
>> > 1. There must be a replacement with functionality compatibility before
>> APIs
>> > can be marked as @Retired, i.e. DISCUSS and VOTE processes on the ML are
>> > mandatory (a FLIP is recommended).
>> > 2. APIs marked as @Retired will be removed after 1 minor release sharply
>> > (using ArchUnit to force it, needs further check whether it is possible).
>> > Devs who marked them as @Retired are responsible to remove them.
>> > 3. Both @Public -> @Retired and @PublicEvolving -> @Retired are
>> > recommended. @Experimental -> @Retired and @Internal -> @Retired could
>> also
>> > be used if it can increase user-friendliness or dev-friendliness, but not
>> > mandatory.
>> > 4. Some variables will be defined in @Retired to support the deprecation
>> > process management. Further extension is possible, since the annotation
>> is
>> > built by us.
>> >
>> >
>> > Best regards,
>> > Jing
>> >
>> > On Fri, Jun 16, 2023 at 10:31 AM Becket Qin <becket....@gmail.com>
>> wrote:
>> >
>> >> Hi Xintong,
>> >>
>> >> Thanks for the explanation. Please see the replies inline below.
>> >>
>> >> I agree. And from my understanding, demoting a Public API is also a
>> kind of
>> >> > such change, just like removing one, which can only happen with major
>> >> > version bumps. I'm not proposing to allow demoting Public APIs
>> anytime,
>> >> but
>> >> > only in the case major version bumps happen before reaching the
>> >> > 2-minor-release migration period. Actually, demoting would be a weaker
>> >> > change compared to removing the API immediately upon major version
>> bumps,
>> >> > in order to keep the commitment about the 2-minor-release migration
>> >> period.
>> >> > If the concern is that `@Public` -> `@PublicEvolving` sounds against
>> >> > conventions, we may introduce a new annotation if necessary, e.g.,
>> >> > `@PublicRetiring`, to avoid confusions.
>> >>
>> >> As an end user who only uses Public APIs, if I don't change my code at
>> all,
>> >> my expectation is the following:
>> >> 1. Upgrading from 1.x to 2.x may have issues.
>> >> 2. If I can upgrade from 1.x to 2.x without an issue, I am fine with all
>> >> the 2.x versions.
>> >> Actually I think there are some dependency version resolution policies
>> out
>> >> there which picks the highest minor version when the dependencies pull
>> in
>> >> multiple minor versions of the same jar, which may be broken if we
>> remove
>> >> the API in minor releases.
>> >>
>> >> I'm not sure about this. Yes, it's completely "legal" that we bump up
>> the
>> >> > major version whenever a breaking change is needed. However, this also
>> >> > weakens the value of the commitment that public APIs will stay stable
>> >> > within the major release series, as the series can end anytime. IMHO,
>> >> short
>> >> > major release series are not something "make the end users happy", but
>> >> > backdoors that allow us as the developers to make frequent breaking
>> >> > changes. On the contrary, with the demoting approach, we can still
>> have
>> >> > longer major release series, while only allowing Public APIs
>> deprecated
>> >> at
>> >> > the end of the previous major version to be removed in the next major
>> >> > version.
>> >>
>> >> I totally agree that frequent major version bumps are not ideal, but
>> here
>> >> we are comparing it with a minor version bump which removes a Public
>> API.
>> >> So the context is that we have already decided to remove this Public API
>> >> while keeping everything else backwards compatible. I think a major
>> version
>> >> bump is a commonly understood signal here, compared with a minor version
>> >> change. From end users' perspective, for those who are not impacted, in
>> >> this case upgrading a major version is not necessarily more involved
>> than
>> >> upgrading a minor version - both should be as smooth as a dependency
>> >> version change. For those who are impacted, they will lose the Public
>> API
>> >> anyways and a major version bump ensures there is no surprise.
>> >>
>> >> Thanks,
>> >>
>> >> Jiangjie (Becket) Qin
>> >>
>> >> On Fri, Jun 16, 2023 at 10:13 AM Xintong Song <tonysong...@gmail.com>
>> >> wrote:
>> >>
>> >> > Public API is a well defined common concept, and one of its
>> >> >> convention is that it only changes with a major version change.
>> >> >>
>> >> >
>> >> > I agree. And from my understanding, demoting a Public API is also a
>> kind
>> >> > of such change, just like removing one, which can only happen with
>> major
>> >> > version bumps. I'm not proposing to allow demoting Public APIs
>> anytime,
>> >> but
>> >> > only in the case major version bumps happen before reaching the
>> >> > 2-minor-release migration period. Actually, demoting would be a weaker
>> >> > change compared to removing the API immediately upon major version
>> bumps,
>> >> > in order to keep the commitment about the 2-minor-release migration
>> >> period.
>> >> > If the concern is that `@Public` -> `@PublicEvolving` sounds against
>> >> > conventions, we may introduce a new annotation if necessary, e.g.,
>> >> > `@PublicRetiring`, to avoid confusions.
>> >> >
>> >> > But it should be
>> >> >> completely OK to bump up the major version if we really want to get
>> rid
>> >> of
>> >> >> a public API, right?
>> >> >>
>> >> >
>> >> > I'm not sure about this. Yes, it's completely "legal" that we bump up
>> the
>> >> > major version whenever a breaking change is needed. However, this also
>> >> > weakens the value of the commitment that public APIs will stay stable
>> >> > within the major release series, as the series can end anytime. IMHO,
>> >> short
>> >> > major release series are not something "make the end users happy", but
>> >> > backdoors that allow us as the developers to make frequent breaking
>> >> > changes. On the contrary, with the demoting approach, we can still
>> have
>> >> > longer major release series, while only allowing Public APIs
>> deprecated
>> >> at
>> >> > the end of the previous major version to be removed in the next major
>> >> > version.
>> >> >
>> >> > Given our track record I would prefer a regular cycle (1-2 years) to
>> >> >> force us to think about this whole topic, and not put it again to the
>> >> >> wayside and giving us (and users) a clear expectation on when
>> breaking
>> >> >> changes can be made.
>> >> >>
>> >> >
>> >> > +1. I personally think 2-3 years would be a good time for new major
>> >> > versions, or longer if there's no breaking changes needed. That makes
>> 1-2
>> >> > year a perfect time to revisit the topic, while leaving us more time
>> to
>> >> > prepare the major release if needed.
>> >> >
>> >> > Best,
>> >> >
>> >> > Xintong
>> >> >
>> >> >
>> >> >
>> >> > On Thu, Jun 15, 2023 at 10:09 PM Chesnay Schepler <ches...@apache.org
>> >
>> >> > wrote:
>> >> >
>> >> >> On 13/06/2023 17:26, Becket Qin wrote:
>> >> >> > It would be valuable if we can avoid releasing minor versions for
>> >> >> previous
>> >> >> > major versions.
>> >> >>
>> >> >> On paper, /absolutely /agree, but I'm not sure how viable that is in
>> >> >> practice.
>> >> >>
>> >> >> On the current 2.0 agenda is potentially dropping support for Java
>> 8/11,
>> >> >> which may very well be a problem for our current users.
>> >> >>
>> >> >>
>> >> >> On 13/06/2023 17:26, Becket Qin wrote:
>> >> >> > Thanks for the feedback and sorry for the confusion about Public
>> API
>> >> >> > deprecation. I just noticed that there was a mistake in the NOTES
>> part
>> >> >> for
>> >> >> > Public API due to a copy-paste error... I just fixed it.
>> >> >> I'm very relieved to hear that. Glad to hear that we are on the same
>> >> >> page on that note.
>> >> >>
>> >> >>
>> >> >> On 15/06/2023 15:20, Becket Qin wrote:
>> >> >> > But it should be
>> >> >> > completely OK to bump up the major version if we really want to get
>> >> rid
>> >> >> of
>> >> >> > a public API, right?
>> >> >>
>> >> >> Technically yes, but look at how long it took to get us to 2.0. ;)
>> >> >>
>> >> >> There's a separate discussion to be had on the cadence of major
>> releases
>> >> >> going forward, and there seem to be different opinions on that.
>> >> >>
>> >> >> If we take the Kafka example of 2 minor releases between major ones,
>> >> >> that for us means that users have to potentially deal with breaking
>> >> >> changes every 6 months, which seems like a lot.
>> >> >>
>> >> >> Given our track record I would prefer a regular cycle (1-2 years) to
>> >> >> force us to think about this whole topic, and not put it again to the
>> >> >> wayside and giving us (and users) a clear expectation on when
>> breaking
>> >> >> changes can be made.
>> >> >>
>> >> >> But again, maybe this should be in a separate thread.
>> >> >>
>> >> >> On 14/06/2023 11:37, Becket Qin wrote:
>> >> >> > Do you have an example of behavioral change in mind? Not sure I
>> fully
>> >> >> > understand the concern for behavioral change here.
>> >> >>
>> >> >> This could be a lot of things. It can be performance in certain
>> >> >> edge-cases, a bug fix that users (maybe unknowingly) relied upon
>> >> >> (https://xkcd.com/1172/), a semantic change to some API.
>> >> >>
>> >> >> For a concrete example, consider the job submission. A few releases
>> back
>> >> >> we made changes such that the initialization of the job master
>> happens
>> >> >> asynchronously.
>> >> >> This meant the job submission call returns sooner, and the job state
>> >> >> enum was extended to cover this state.
>> >> >> API-wise we consider this a compatible change, but the observed
>> behavior
>> >> >> may be different.
>> >> >>
>> >> >> Metrics are another example; I believe over time we changed what some
>> >> >> metrics returned a few times.
>> >> >>
>> >> >
>> >>
>>

Reply via email to