Hi,

tl;dr: we now have @Public, @Internal, @Experimental annotations. Check
your stuff before the release!

Fabian and I spend some time the last weeks to annotate all classes we
consider to be userfacing and stable with the "*@Public*" annotation. I
just pushed those changes to master.

There is also an annotation "*@Internal*" for marking interfaces users
should not use because they are internal to the system (for example
"DataStream.getId()").

The annotation "*@Experimental*" marks unstable methods within stable
classes (for example SingleOutputStreamOperator.uid()).
Also note that we should also annotate @Deprecated methods with
@Experimental so that they are not part of the stable interface (this works
only before the 1.0 release). I checked that all current @Deprecated
annotations are excluded.


*I would like to ask everyone to spend some time before the 1.0 release to
go through some core classes and see if there is anything we forgot.*
*We will not be able to touch methods and classes which are public after
the 1.0 release.*

Some areas where I feel we should check closely are the following:
- InputFormats
- State-related classes
- Windowing related classes
- DataStream API (global() / forward(); output to files; ... ).

Fabian and I also realized that there are some downsides to this annotation
approach.
a) By not annotating all classes, its easy to forget some classes. And its
not obvious to users that "no annotation" means "not public".

b) For example the "SourceFunction.SourceContext" interface is @Public
because users use the methods of the interface.
However, the underlying implementations are internal to Flink (users will
most likely not implement their own SourceContexts). Adding a new method to
the SourceContext interface will break its compatibilty (because users
would need to implement the new method), however, for API users it does not
matter when we are adding new methods.
We decided to make the interface @Public, but we added a comment explaining
the issue.
If we want to add a method after the 1.0 release, we can define an exclude
in the maven plugin which enforces the interface stability.


For making the whole annotation analysis business a bit easier, I'm
currently working on a little tool to output a list of public classes and
methods. I'll post that on the mailing list at a later point.

Regards,
Robert

Reply via email to