Binary backwards-incompatibily in 1.33.0
See original GitHub issueMy library contains code like:
NettyChannelBuilder ncb = NettyChannelBuilder.forTarget(...);
ncb.setMaxInboundMessageSize(...);
ncb.eventLoopGroup(...);
// ...
ManagedChannel channel = ncb.build();
which breaks when moving from pre-1.33.0 to 1.33.0, unless recompiled (and then the new binary would not be compatible with versions < 1.33.0). This is because a class (AbstractManagedChannelImplBuilder
) was removed from the direct superclass heriarchy:
Changing the direct superclass or the set of direct superinterfaces of a class type will not break compatibility with pre-existing binaries, provided that the total set of superclasses or superinterfaces, respectively, of the class type loses no members.
I know that technically netty transport is still considered experimental (per #1784), but (a) it’s the primary transport and (b) it’s been that way for more than 4 years.
Was this intentional/known or is it a case of “it’s experimental, tough!”?
It should be easy to avoid I think by for example just adding an empty abstract class AbstractManagedChannelImplBuilder extends ForwardingChannelBuilder
… maybe in a 1.33.1? 😃
Issue Analytics
- State:
- Created 3 years ago
- Comments:16 (16 by maintainers)
Yes, it could. But that is of dubious value. New invocations of javac will still use the AbstractManagedChannelImplBuilder-returning methods.
No. It isn’t a new class. It’s actually pretty old. We can do that with ForwardingServerBuilder, but it is probably better to just remove/hide the class in the short-term.
@njhill, in your example
ForwardingChannelBuilder<T extends AbstractManagedChannelImplBuilder<T>>
is redefining all the methods. So it is necessary. That signature is very bad though, as it increases the amount of code that will reference the internal class.I was suggesting having
ForwardingChannelBuilder<T extends ForwardingChannelBuilder<T>>
, so that new compilations would stop referencing the internal class. For the old methods to show up with that approach,AbstractManagedChannelImplBuilder
would need to redefine all the methods.