From 6790323959b4acd6200f3c249910fb0cc6f67a2d Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Wed, 13 Oct 2021 14:27:26 -0700 Subject: [PATCH] Emulate AbstractManagedChannelImplBuilder maxInboundMessageSize(int) In dbd903c0 we started generatating AbstractManagedChannelImplBuilder methods in a way that they are present for ABI but on recompilation only public ManagedChannelBuilder-returning methods would be used. However, this sorta missed maxInboundMessageSize which is now being handled by the concrete classes (e.g, NettyChannelBuilder) instead of ManagedChannelImplBuilder. Users on the old ABI will end up getting ManagedChannelImplBuilder.maxInboundMessageSize() which does nothing. So, let's just implement the method and have it jump back up to the concrete class. Hacky, but easy and predictable and will go away once we remove the rest of the AbstractManagedChannelImplBuilder compatibility hacks. Fixes #8313 --- .../internal/ManagedChannelImplBuilder.java | 22 +++++++++++++++++++ .../io/grpc/netty/NettyChannelBuilder.java | 11 ++++++++++ .../io/grpc/okhttp/OkHttpChannelBuilder.java | 9 ++++++++ 3 files changed, 42 insertions(+) diff --git a/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java b/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java index 243a555ad1a..031c2fa2e5e 100644 --- a/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java +++ b/core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java @@ -707,6 +707,28 @@ int getDefaultPort() { return channelBuilderDefaultPortProvider.getDefaultPort(); } + // Remove this emulation when we delete AbstractManagedChannelImplBuilder + private AbstractManagedChannelImplBuilderEmulator abstractManagedChannelImplBuilderEmulator; + + public interface AbstractManagedChannelImplBuilderEmulator { + void maxInboundMessageSize(int max); + } + + public void emulateAbstractManagedChannelImplBuilder( + AbstractManagedChannelImplBuilderEmulator abstractManagedChannelImplBuilderEmulator) { + this.abstractManagedChannelImplBuilderEmulator = abstractManagedChannelImplBuilderEmulator; + } + + @Override + public ManagedChannelImplBuilder maxInboundMessageSize(int max) { + if (abstractManagedChannelImplBuilderEmulator != null) { + abstractManagedChannelImplBuilderEmulator.maxInboundMessageSize(max); + return this; + } else { + return super.maxInboundMessageSize(max); // noop + } + } + private static class DirectAddressNameResolverFactory extends NameResolver.Factory { final SocketAddress address; final String authority; diff --git a/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java b/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java index 809c94f12ce..95fa2d98f95 100644 --- a/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java +++ b/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java @@ -201,6 +201,7 @@ public int getDefaultPort() { managedChannelImplBuilder = new ManagedChannelImplBuilder(target, new NettyChannelTransportFactoryBuilder(), new NettyChannelDefaultPortProvider()); + managedChannelImplBuilder.emulateAbstractManagedChannelImplBuilder(new OldBuilderEmulator()); this.freezeProtocolNegotiatorFactory = false; } @@ -211,6 +212,7 @@ public int getDefaultPort() { target, channelCreds, callCreds, new NettyChannelTransportFactoryBuilder(), new NettyChannelDefaultPortProvider()); + managedChannelImplBuilder.emulateAbstractManagedChannelImplBuilder(new OldBuilderEmulator()); this.protocolNegotiatorFactory = checkNotNull(negotiator, "negotiator"); this.freezeProtocolNegotiatorFactory = true; } @@ -221,6 +223,7 @@ public int getDefaultPort() { getAuthorityFromAddress(address), new NettyChannelTransportFactoryBuilder(), new NettyChannelDefaultPortProvider()); + managedChannelImplBuilder.emulateAbstractManagedChannelImplBuilder(new OldBuilderEmulator()); this.freezeProtocolNegotiatorFactory = false; } @@ -232,6 +235,7 @@ public int getDefaultPort() { channelCreds, callCreds, new NettyChannelTransportFactoryBuilder(), new NettyChannelDefaultPortProvider()); + managedChannelImplBuilder.emulateAbstractManagedChannelImplBuilder(new OldBuilderEmulator()); this.protocolNegotiatorFactory = checkNotNull(negotiator, "negotiator"); this.freezeProtocolNegotiatorFactory = true; } @@ -764,4 +768,11 @@ public void close() { groupPool.returnObject(group); } } + + private final class OldBuilderEmulator implements + ManagedChannelImplBuilder.AbstractManagedChannelImplBuilderEmulator { + @Override public void maxInboundMessageSize(int max) { + NettyChannelBuilder.this.maxInboundMessageSize(max); + } + } } diff --git a/okhttp/src/main/java/io/grpc/okhttp/OkHttpChannelBuilder.java b/okhttp/src/main/java/io/grpc/okhttp/OkHttpChannelBuilder.java index f7d0d973802..61d4f79c644 100644 --- a/okhttp/src/main/java/io/grpc/okhttp/OkHttpChannelBuilder.java +++ b/okhttp/src/main/java/io/grpc/okhttp/OkHttpChannelBuilder.java @@ -191,6 +191,7 @@ private OkHttpChannelBuilder(String target) { managedChannelImplBuilder = new ManagedChannelImplBuilder(target, new OkHttpChannelTransportFactoryBuilder(), new OkHttpChannelDefaultPortProvider()); + managedChannelImplBuilder.emulateAbstractManagedChannelImplBuilder(new OldBuilderEmulator()); this.freezeSecurityConfiguration = false; } @@ -201,6 +202,7 @@ private OkHttpChannelBuilder(String target) { target, channelCreds, callCreds, new OkHttpChannelTransportFactoryBuilder(), new OkHttpChannelDefaultPortProvider()); + managedChannelImplBuilder.emulateAbstractManagedChannelImplBuilder(new OldBuilderEmulator()); this.sslSocketFactory = factory; this.negotiationType = factory == null ? NegotiationType.PLAINTEXT : NegotiationType.TLS; this.freezeSecurityConfiguration = true; @@ -830,4 +832,11 @@ public void close() { } } } + + private final class OldBuilderEmulator implements + ManagedChannelImplBuilder.AbstractManagedChannelImplBuilderEmulator { + @Override public void maxInboundMessageSize(int max) { + OkHttpChannelBuilder.this.maxInboundMessageSize(max); + } + } }