Hi Shammon, Thanks for asking. @PublicEvolving is actually a very useful design that developers can offer APIs as publicly accessible but still have changes to introduce modifications afterwards between minor releases. Compared to it, all @Public APIs can only be changed between major releases. Beyond the FLIP-197 mentioned by Becket, you might want to check FLIP-196[1] for further details.
Best regards, Jing [1] https://cwiki.apache.org/confluence/display/FLINK/FLIP-196%3A+Source+API+stability+guarantees On Mon, Sep 11, 2023 at 9:46 AM Becket Qin <becket....@gmail.com> wrote: > Hi Shammon, > > Thanks for the reply. > > Do we really need to have `@Internal` methods in an `@Public` interface or > > class? In general, if a class or interface is marked as `@Public `, it is > > better that their public methods should also be `@Public`, because even > if > > marked as `@Internal`, users are not aware of it when using it, which > could > > be strange. > > It is more like a legacy issue that the public and internal usage share the > same concrete class. e.g. DataStream.getId() is for internal usage, but > happens to be in DataStream which is a public class. This should be avoided > in the future. It is a good practice to create separate interfaces should > be created for the users in this case. > > Regarding the API stability promotion, you may want to check the > FLIP-197[1]. > > Thanks, > > Jiangjie (Becket) Qin > > [1] > > https://cwiki.apache.org/confluence/display/FLINK/FLIP-197%3A+API+stability+graduation+process > > On Mon, Sep 11, 2023 at 11:43 AM Shammon FY <zjur...@gmail.com> wrote: > > > Thanks Jing for starting this discussion. > > > > For @Becket > > > 1. All the public methods / classes / interfaces MUST be annotated with > > one of the @Experimental / @PublicEvolving / @Public. In practice, all > the > > methods by default inherit the annotation from the containing class, > unless > > annotated otherwise. e.g. an @Internal method in a @Public class. > > > > Do we really need to have `@Internal` methods in an `@Public` interface > or > > class? In general, if a class or interface is marked as `@Public `, it is > > better that their public methods should also be `@Public`, because even > if > > marked as `@Internal`, users are not aware of it when using it, which > could > > be strange. > > > > @Jing Besides `@Internal`, I have some cents about `@PublicEvolving` and > > `@Public`. Currently when we add an interface which will be used by > > external systems, we often annotate it as `@PublicEvolving`. But when > > should this interface be marked as `@Public`? I find it is difficult to > > determine this. Is `@PublicEvolving` really necessary? Should we directly > > remove `@PublicEvolving` and use `@Public` instead? I think it would be > > simpler. > > > > Best, > > Shammon FY > > > > > > On Mon, Sep 11, 2023 at 11:05 AM Becket Qin <becket....@gmail.com> > wrote: > > > > > Hi Jing, > > > > > > Thanks for bringing up the discussion. My two cents: > > > > > > 1. All the public methods / classes / interfaces MUST be annotated with > > one > > > of the @Experimental / @PublicEvolving / @Public. In practice, all the > > > methods by default inherit the annotation from the containing class, > > unless > > > annotated otherwise. e.g. an @Internal method in a @Public class. > > > > > > 2. I agree it would be too verbose to annotate every internal method / > > > class / interface. Currently we already treat the methods / interfaces > / > > > classes without annotations as effectively @Internal. > > > > > > 3. Per our discussion in the other thread, @Deprecated SHOULD coexist > > with > > > one of the @Experimental / @PublicEvolving / @Public. In that > > > case, @Deprecated overrides the other annotation, which means that > public > > > API will not evolve and will be removed according to the deprecation > > > process. > > > > > > 4. The internal methods / classes / interfaces SHOULD NOT be marked as > > > deprecated. Instead, an immediate refactor should be done to remove the > > > "deprecated" internal methods / classes / interfaces, and migrate the > > code > > > to its successor. Otherwise, technical debts will build up. > > > > > > Thanks, > > > > > > Jiangjie (Becket) Qin > > > > > > > > > > > > On Sat, Sep 9, 2023 at 5:29 AM Jing Ge <j...@ververica.com.invalid> > > wrote: > > > > > > > Hi devs, > > > > > > > > While I was joining the flink-avro enhancement and cleanup discussion > > > > driven by Becket[1], I realized that there are some issues with the > > > current > > > > Flink API annotation usage in the source code. > > > > > > > > As far as I am concerned, Flink wants to control the > access/visibility > > of > > > > APIs across modules and for downstreams. Since no OSGI is used(it > > should > > > > not be used because of its complexity, IMHO), Flink decided to use a > > very > > > > lightweight but manual solution: customized annotation like > @Internal, > > > > @Experimental, @PublicEvolving, > > > > etc. This is a Flink only concept on top of JDK annotation and is > > > therefore > > > > orthogonal to @Deprecated or any other annotations offered by JDK. > > After > > > > this concept has been used, APIs without one of these annotations are > > in > > > > the kind of gray area which means they have no contract in the > context > > of > > > > this new concept. Without any given metadata they could be considered > > > > as @Internal or @Experimental, because changes are allowed to be > > applied > > > at > > > > any time. But there is no clear definition and therefore different > > people > > > > will understand it differently. > > > > > > > > There are two options to improve it, as far as I could figure out: > > > > > > > > option 1: All APIs must have one of those annotations. We should put > > some > > > > effort into going through all source code and add missing > annotations. > > > > There were discussions[2] and activities going in this direction. > > > > option 2: the community comes to a new consensus that APIs without > > > > annotation equals one of @Internal, @Experimental, or > @PublicEvolving. > > I > > > > personally will choose @Internal, because it is the safest one. And > if > > > > @Internal is chosen as the default one, it could also be deprecated, > > > > because no annotation equals @Internal. If it makes sense, I can > > create a > > > > FLIP and help the community reach this consensus. > > > > > > > > Both options have their own pros and cons. I would choose option 2, > > since > > > > we will not end up with a lot of APIs marked as @Internal. > > > > > > > > Looking forward to hearing your thoughts. > > > > > > > > Best regards > > > > Jing > > > > > > > > > > > > [1] https://lists.apache.org/thread/7zsv528swbjxo5zk0bxq33hrkvd77d6f > > > > [2] https://lists.apache.org/thread/zl2rmodsjsdb49tt4hn6wv3gdwo0m31o > > > > > > > > > >