Hi Fabian,

Thanks for your input. Adding the definition of the different labels to our
documentation is definitely part of this FLIP.

I agree that deprecation is related to API stability. For the sake of
keeping this FLIP narrowly scoped I left it out, though. For the time being
I suggest that we stick to our current deprecation process that says that a
deprecated API can only be removed after it has been deprecated for at
least one release. Of course, deprecating and removing a @PublicEvolving
API can only happen in minor or major releases, for example. This process
is a bit stricter than what the API stability guarantees require because
with the API stability alone we could remove the APIs directly w/o the
deprecation period. Other details I would leave for a follow up FLIP
which formally defines the deprecation process.

Cheers,
Till

On Tue, Dec 7, 2021 at 10:08 AM Fabian Paul <fp...@apache.org> wrote:

> Hi all,
>
> Thanks Till for starting this discussion. It is great to see these
> facts written down since they definitely caused friction in the past
> because of different interpretations. Overall I agree with everything
> being said in this FLIP. I was just wondering whether we can put the
> label explaining table somewhere into our docs. FLIPs are usually only
> snapshots for the time being and are hard to search for. It would
> allow users to instantly determine the meaning of the used annotation.
>
> I am also missing in this FLIP the connection to the Deprecated
> annotation. I think we also need to clarify how this should be used in
> conjunction with the API stability.
>
> Best,
> Fabian
>
> On Mon, Dec 6, 2021 at 10:03 AM Ingo Bürk <i...@ververica.com> wrote:
> >
> > Hi Till,
> >
> > seems I misunderstood it then; thanks for the clarification! And yes,
> with
> > that I would fully agree.
> >
> >
> > Ingo
> >
> > On Mon, Dec 6, 2021 at 9:59 AM Till Rohrmann <trohrm...@apache.org>
> wrote:
> >
> > > Hi Ingo,
> > >
> > > No, the added method can have a weaker stability guarantee as long as
> the
> > > user does not have to implement it. In order to give an example the
> > > following extension would be ok imo:
> > >
> > > @Public
> > > interface Foobar {
> > >     @Public
> > >     int foo();
> > >
> > >     @Experimental
> > >     default ExperimentalResult bar() {
> > >       return ExperimentalResult.notSupported();
> > >     }
> > > }
> > >
> > > The following extension would not be ok because here the user needs to
> > > implement something new:
> > >
> > > @Public
> > > interface Foobar {
> > >     @Public
> > >     int foo();
> > >
> > >     @Experimental
> > >     ExperimentalResult bar();
> > > }
> > >
> > > Moreover, if the user uses bar(), then he opts-in to only get
> @Experimental
> > > stability guarantees.
> > >
> > > I will add this example to the FLIP for illustrative purposes.
> > >
> > > Cheers,
> > > Till
> > >
> > > On Fri, Dec 3, 2021 at 6:52 PM Ingo Bürk <i...@ververica.com> wrote:
> > >
> > > > > Would it be enough to say that for example all classes in the
> module
> > > > flink-java have to be annotated? What I would like to avoid is
> having to
> > > > annotate all classes in some internal module like flink-rpc.
> > > >
> > > > I don't think it is, but we certainly could restrict it to certain
> top
> > > > level o.a.f.xyz packages.
> > > >
> > > > > Extending existing classes will only be possible if you can
> provide a
> > > > default implementation
> > > >
> > > > That I'm totally fine with, but based on that sentence in the FLIP
> if I
> > > > have a public interface and extend it, even with a default
> > > implementation,
> > > > I _have_ to have this method be stable already as well, right? I
> couldn't
> > > > for example add an experimental method to an interface.
> > > >
> > > > This would also include all classes used as argument and return type
> of
> > > > such methods too, which seems quite restrictive.
> > > >
> > > >
> > > > Best
> > > > Ingo
> > > >
> > > > On Fri, Dec 3, 2021, 17:51 Till Rohrmann <trohrm...@apache.org>
> wrote:
> > > >
> > > > > >That's still a much weaker requirement, though, as classes can
> just be
> > > > > left unannotated, which is why I prefer annotating all classes
> > > regardless
> > > > > of location.
> > > > >
> > > > > Would it be enough to say that for example all classes in the
> module
> > > > > flink-java have to be annotated? What I would like to avoid is
> having
> > > to
> > > > > annotate all classes in some internal module like flink-rpc.
> > > > >
> > > > > > How would you handle e.g. extending an existing Public interface
> > > with a
> > > > > new method in this case, though? You'd be forced to immediately
> make
> > > the
> > > > > new method Public as well, or place it somewhere else entirely,
> which
> > > > leads
> > > > > to unfavorable design. I don't think we should disallow extending
> > > classes
> > > > > with methods of a weaker stability.
> > > > >
> > > > > Extending existing classes will only be possible if you can
> provide a
> > > > > default implementation. If the user needs to do something, then it
> is
> > > not
> > > > > compatible and needs to be handled differently (e.g. by offering a
> new
> > > > > experimental interface that one can use). If we don't enforce this,
> > > then
> > > > I
> > > > > don't see how we can provide source stability guarantees.
> > > > >
> > > > > Cheers,
> > > > > Till
> > > > >
> > > > > On Fri, Dec 3, 2021 at 5:22 PM Ingo Bürk <i...@ververica.com>
> wrote:
> > > > >
> > > > > > Hi Till,
> > > > > >
> > > > > > > Personally, I'd be fine to say that in API modules (tbd what
> this
> > > is
> > > > > > > (probably transitive closure of all APIs)) we require every
> class
> > > to
> > > > be
> > > > > > > annotated.
> > > > > >
> > > > > > At least we'll then need the reverse rule: no classes outside
> *.api.*
> > > > > > packages CAN have an API annotation (other than Internal), of
> course
> > > > with
> > > > > > many existing violations that need to be accapted.
> > > > > >
> > > > > > That's still a much weaker requirement, though, as classes can
> just
> > > be
> > > > > left
> > > > > > unannotated, which is why I prefer annotating all classes
> regardless
> > > of
> > > > > > location.
> > > > > >
> > > > > > > If we have cases that violate the guideline, then I think we
> either
> > > > > have
> > > > > > to
> > > > > > > remove these methods
> > > > > >
> > > > > > How would you handle e.g. extending an existing Public interface
> > > with a
> > > > > new
> > > > > > method in this case, though? You'd be forced to immediately make
> the
> > > > new
> > > > > > method Public as well, or place it somewhere else entirely, which
> > > leads
> > > > > to
> > > > > > unfavorable design. I don't think we should disallow extending
> > > classes
> > > > > with
> > > > > > methods of a weaker stability.
> > > > > >
> > > > > >
> > > > > > Best
> > > > > > Ingo
> > > > > >
> > > > > > On Fri, Dec 3, 2021 at 4:53 PM Till Rohrmann <
> trohrm...@apache.org>
> > > > > wrote:
> > > > > >
> > > > > > > Hi Ingo, thanks a lot for your thoughts and the work you've
> spent
> > > on
> > > > > this
> > > > > > > topic already.
> > > > > > >
> > > > > > > Personally, I'd be fine to say that in API modules (tbd what
> this
> > > is
> > > > > > > (probably transitive closure of all APIs)) we require every
> class
> > > to
> > > > be
> > > > > > > annotated.
> > > > > > >
> > > > > > > For sake of clarity and having clear rules, this should then
> also
> > > > apply
> > > > > > to
> > > > > > > nested types. As you've said this would have some additional
> > > benefits
> > > > > > when
> > > > > > > doing refactorings and seems to be actually required by
> japicmp.
> > > > > > >
> > > > > > > >This seems to be quite incompatible with the current
> > > interpretation
> > > > in
> > > > > > the
> > > > > > > code base, and it would prevent valid (and in-use) use cases
> like
> > > > > marking
> > > > > > > e.g. a single method experimental (or even internal) in an
> > > otherwise
> > > > > > public
> > > > > > > (evolving) API.
> > > > > > >
> > > > > > > If we have cases that violate the guideline, then I think we
> either
> > > > > have
> > > > > > to
> > > > > > > remove these methods or adjust their stability guarantees
> (time of
> > > > > > > reckoning ;-). Otherwise, we won't be able to give stability
> > > > > guarantees,
> > > > > > I
> > > > > > > fear.
> > > > > > >
> > > > > > > Cheers,
> > > > > > > Till
> > > > > > >
> > > > > > > On Fri, Dec 3, 2021 at 4:23 PM Ingo Bürk <i...@ververica.com>
> > > wrote:
> > > > > > >
> > > > > > > > Hi Till,
> > > > > > > >
> > > > > > > > Thanks for starting this discussion, and as you noticed, I
> qutie
> > > > care
> > > > > > for
> > > > > > > > it as well. :-)
> > > > > > > >
> > > > > > > > When implementing the ArchUnit rules, I noticed that
> > > project-wide,
> > > > > > > > different teams / modules use and understand the API
> annotations
> > > in
> > > > > > > > different ways. Therefore, I think it is important to both
> get
> > > > > clarity
> > > > > > on
> > > > > > > > the meaning of these annotations (= your FLIP), but also on
> how
> > > to
> > > > > > > actually
> > > > > > > > use them.
> > > > > > > >
> > > > > > > > One thing I would like to bring up for discussion is
> requiring an
> > > > API
> > > > > > > > annotation on every class. This seems to be a controversial
> > > > > suggestion,
> > > > > > > > though personally I think it would allow our tooling do its
> job
> > > > best.
> > > > > > An
> > > > > > > > obvious downside is "it's annoying", but so is the current
> > > > > requirement
> > > > > > of
> > > > > > > > having JavaDocs on every class (including tests). If this
> were to
> > > > > ever
> > > > > > be
> > > > > > > > considered, this should be implemented (also) in Checkstyle,
> > > > though,
> > > > > to
> > > > > > > > have it as immediate IDE feedback, which IMO would also
> mostly
> > > > > > eliminate
> > > > > > > > this downside. The other downside is that it encourages
> throwing
> > > > > > > > Public(Evolving) around, but that would really only make an
> > > > existing
> > > > > > > > invisible problem actually visible; ultimately, I think this
> is
> > > > > > something
> > > > > > > > that committers just need to consider.
> > > > > > > > It would be nice to only require this in *.api.* packages,
> but
> > > > that's
> > > > > > > just
> > > > > > > > not the world we live in, nor will it be anytime soon;
> however,
> > > it
> > > > > > would
> > > > > > > > allow us to make sure that new non-internal APIs are only
> added
> > > in
> > > > > > > *.api.*
> > > > > > > > packages, or that no public APIs are added in *.internal.*
> > > > packages.
> > > > > > > >
> > > > > > > > Another aspect that came up both when implementing the rules
> and
> > > > > again
> > > > > > > in a
> > > > > > > > discussion is whether (or when) nested types (classes,
> > > interfaces –
> > > > > > > > not members) need to be annotated explicitly. My
> understanding[1]
> > > > is
> > > > > > that
> > > > > > > > this is actually needed for japicmp to work correctly.
> Besides
> > > > that,
> > > > > I
> > > > > > > > think doing so adds benefits such as making the breaking
> change
> > > > > visible
> > > > > > > > when promoting a nested type to a top-level type, which would
> > > > likely
> > > > > go
> > > > > > > > unquestioned if the type is not annotated but "inherited"
> its API
> > > > > > > > stability, losing it in the process.
> > > > > > > >
> > > > > > > > Now to actually comment on your FLIP:
> > > > > > > >
> > > > > > > > > In order to determine the stability guarantee a given
> > > > > class/interface
> > > > > > > can
> > > > > > > > provide, we have to take a look at all methods a user has to
> > > > > implement
> > > > > > > and
> > > > > > > > use for using the given class/interface. The weakest
> guarantee of
> > > > > these
> > > > > > > > methods specifies the guarantee we can give for the
> containing
> > > > > > > > class/interface.
> > > > > > > >
> > > > > > > > This seems to be quite incompatible with the current
> > > interpretation
> > > > > in
> > > > > > > the
> > > > > > > > code base, and it would prevent valid (and in-use) use cases
> like
> > > > > > marking
> > > > > > > > e.g. a single method experimental (or even internal) in an
> > > > otherwise
> > > > > > > public
> > > > > > > > (evolving) API.
> > > > > > > >
> > > > > > > > [1]
> > > > > https://github.com/apache/flink/pull/17133#issuecomment-925738694
> > > > > > > >
> > > > > > > >
> > > > > > > > Best
> > > > > > > > Ingo
> > > > > > > >
> > > > > > > > On Thu, Dec 2, 2021 at 3:48 PM Till Rohrmann <
> > > trohrm...@apache.org
> > > > >
> > > > > > > wrote:
> > > > > > > >
> > > > > > > > > Hi everyone,
> > > > > > > > >
> > > > > > > > > I would like to start a discussion about what kind of API
> > > > stability
> > > > > > > > > guarantees we want to provide to our users. The Flink
> community
> > > > > > already
> > > > > > > > > agreed on some stability guarantees, but these guarantees
> were
> > > > only
> > > > > > > > > communicated via the ML and not properly documented [2].
> > > > Moreover,
> > > > > > I've
> > > > > > > > > seen more and more complaints about breaking changes (some
> > > > rightful
> > > > > > and
> > > > > > > > > others not) on the ML recently [3] because we rarely mark
> our
> > > > APIs
> > > > > as
> > > > > > > > > stable. This motivated this FLIP.
> > > > > > > > >
> > > > > > > > > The proposal first concentrates on source API stability
> > > > guarantees.
> > > > > > > > Binary
> > > > > > > > > stability guarantees are explicitly left out for a
> follow-up
> > > > > > > discussion.
> > > > > > > > >
> > > > > > > > > In essence, the proposal follows our current stability
> > > guarantees
> > > > > > while
> > > > > > > > > updating the guarantees for @PublicEvolving that we are
> already
> > > > > > > providing
> > > > > > > > > w/o having stated them. Moreover, this FLIP proposes some
> > > > > guidelines
> > > > > > > for
> > > > > > > > > determining the stability guarantees for an API object,
> how to
> > > > > evolve
> > > > > > > > them
> > > > > > > > > and some additional requirements for the return and
> parameter
> > > > types
> > > > > > of
> > > > > > > > > methods.
> > > > > > > > >
> > > > > > > > > All in all, I hope that this proposal is more reflecting
> our
> > > > > current
> > > > > > > > > understanding of stability guarantees than being
> controversial.
> > > > One
> > > > > > of
> > > > > > > > the
> > > > > > > > > outcomes of this FLIP should be to properly document these
> > > > > guarantees
> > > > > > > so
> > > > > > > > > that it is easily discoverable and understandable for our
> > > users.
> > > > > > > > Moreover,
> > > > > > > > > I hope that we can provide more stable APIs our users can
> rely
> > > > and
> > > > > > > build
> > > > > > > > > upon.
> > > > > > > > >
> > > > > > > > > There will be a follow-up FLIP discussing the problem of
> how to
> > > > > make
> > > > > > > sure
> > > > > > > > > that APIs become stable over time.
> > > > > > > > >
> > > > > > > > > Looking forward to your feedback.
> > > > > > > > >
> > > > > > > > > [1] https://cwiki.apache.org/confluence/x/IJeqCw
> > > > > > > > > [2]
> > > > > https://lists.apache.org/thread/5jm25783oq5svyk7rr8g1gly2ooxqhjr
> > > > > > > > > [3]
> > > > > https://lists.apache.org/thread/kzhfc3t6omzo2kyo8zj9yxoh8twq5fzr
> > > > > > > > >
> > > > > > > > > Cheers,
> > > > > > > > > Till
> > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
>

Reply via email to