I agree with Sean here.
Interfaces with @Private annotations are going to be a problem. I think we
should strongly discourage this. Either allow abstract classes are don't
allow such things. We should have a note about this in the compatibility
guide.

Even regarding the Util classes and the respective static methods - though
we mark APIs private, if we change or remove those APIs still it will have
compatability issues?  We are following a practice of deprecating any API
in such Util classes and removing them only in major APIs but the ones
marked as @Private may be source of problem.

Regards
Ram

On Tue, Aug 16, 2016 at 9:25 AM, Andrew Purtell <andrew.purt...@gmail.com>
wrote:

> > Are we extending this to all interfaces? Do we support folks
> implementing their own Connection? Admin?
>
>  This will bury us in weeds and bikeshedding. We can make a blanket rule
> about source compatibility appropriately scoped to minors and/or patches
> without that drama. To wit:
>
> > So when I read the existing guides, what I see is that we're supposed to
> be _source_ compatible on minor and patch releases, but binary compatible
> only on patch
>
> We should take the opportunity to clarify the language of the
> compatibility guide. And if the above is the policy then the change to
> Table is not allowed.
>
>
> > On Aug 15, 2016, at 8:26 PM, Sean Busbey <bus...@apache.org> wrote:
> >
> > Thanks for bringing this up Josh!
> >
> >
> >
> > On Mon, Aug 15, 2016 at 2:21 PM, Andrew Purtell <apurt...@apache.org>
> wrote:
> >
> >> ​
> >> I find the InterfaceAudience annotations on this really strange. How can
> >> we have a Public audience Interface (o.a.h.h.c.Table) with Private
> methods?
> >>
> >> I'm also not sure the Private annotations on the Table interface are
> that
> >> useful. Any change to an interface renders it source incompatible, and
> >> removal (or effective removal via signature change) of methods from an
> >> interface introduces a binary incompatibility. I think the Private
> >> annotations on methods of a Public interface imply we should refactor
> those
> >> methods to a non-public interface.
> >>
> >
> >
> > Generally, we use more restricted audience annotations on members within
> a
> > given API to show where there are limits on our support that we can't
> > express in Java access modifiers. I think it's important for us to keep
> > this around so that we can avoid a proliferation of "FooUtil" and other
> > classes that exist just to make a Public/Private distinction. (I
> recognize
> > we have several of these but I was hoping we'd move in the direction of
> > fewer over time.)
> >
> > I agree that in the case of interfaces it's problematic, since we have no
> > way to distinguish between "should be consumed" and "can be extended".
> > Perhaps we should make sure we have abstract classes instead of
> interfaces?
> > We could also add an annotation to make the consumed/extended
> distinction;
> > I've seen it come up a few times in other users of audience annotations.
> >
> >
> >
> >> ​
> >> Now that we've had quite a few releases in the "not-quite-SemVer"
> >> compatibility guide, is there any interest in trying to make the
> >> compatibility guarantees more stringent?
> >>
> >> I was looking at our compat guidelines (
> >> http://hbase.apache.org/book.html#hbase.versioning) and think we could
> >> make
> >> a few refinements.
> >>
> >> We make several allowances for public interface changes that are binary
> >> compatible but not source compatible in patch releases. I think we are
> only
> >> taking into consideration callers but should also consider implementors
> of
> >> public interfaces. Changing a public interface on a patch release
> renders
> >> it source incompatible. Can we avoid doing that on *patch* releases, and
> >> restrict this type of change to minors?
> > Are we extending this to all interfaces? Do we support folks implementing
> > their own Connection? Admin?
> >
> >
> >> Although we make allowances for public interface changes that are binary
> >> compatible we also say "A minor upgrade requires no application/client
> code
> >> modification." which could imply source compatibility even across
> minors,
> >> which I believe is not the intent.
> >>
> >> We could add a source compatibility dimension for patch releases.
> >>
> >>
> >> ​
> >> I would like to see us get to source-compatibility on patch releases,
> not
> >> just binary compatibility
> >>
> >> You mean source compatibility for Public annotated interfaces only,
> right?
> >>
> >> In that case evaluating compliance would be easy: RMs would run the API
> >> compat checker on a RC and if a patch release the number of binary and
> >> source compat issues should both be zero.
> > So when I read the existing guides, what I see is that we're supposed to
> be
> > _source_ compatible on minor and patch releases, but binary compatible
> only
> > on patch releases. I think we discussed this a year or two ago, and IIRC
> > the reasoning was that since we maintain wire compatibility on minor and
> > patch releases, those who need to ignore a given set of binary
> incompatible
> > changes can just make use of the older library.
>

Reply via email to