diff --git a/alts/src/main/java/io/grpc/alts/internal/AltsProtocolNegotiator.java b/alts/src/main/java/io/grpc/alts/internal/AltsProtocolNegotiator.java index cd598c86aa..72cd5753bd 100644 --- a/alts/src/main/java/io/grpc/alts/internal/AltsProtocolNegotiator.java +++ b/alts/src/main/java/io/grpc/alts/internal/AltsProtocolNegotiator.java @@ -61,6 +61,11 @@ public abstract class AltsProtocolNegotiator implements ProtocolNegotiator { handshakerFactory.newHandshaker(grpcHandler.getAuthority()))), new TsiFrameHandler()); } + + @Override + public void close() { + // TODO(jiangtaoli2016): release resources + } }; } @@ -75,6 +80,11 @@ public abstract class AltsProtocolNegotiator implements ProtocolNegotiator { new TsiHandshakeHandler(new NettyTsiHandshaker(handshakerFactory.newHandshaker(null))), new TsiFrameHandler()); } + + @Override + public void close() { + // TODO(jiangtaoli2016): release resources + } }; } diff --git a/alts/src/main/java/io/grpc/alts/internal/GoogleDefaultProtocolNegotiator.java b/alts/src/main/java/io/grpc/alts/internal/GoogleDefaultProtocolNegotiator.java index 6bd39ef0d7..b08453452c 100644 --- a/alts/src/main/java/io/grpc/alts/internal/GoogleDefaultProtocolNegotiator.java +++ b/alts/src/main/java/io/grpc/alts/internal/GoogleDefaultProtocolNegotiator.java @@ -49,4 +49,10 @@ public final class GoogleDefaultProtocolNegotiator implements ProtocolNegotiator return tlsProtocolNegotiator.newHandler(grpcHandler); } } + + @Override + public void close() { + altsProtocolNegotiator.close(); + tlsProtocolNegotiator.close(); + } } diff --git a/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java b/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java index b632ab97fc..4989694e33 100644 --- a/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java +++ b/netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java @@ -526,6 +526,7 @@ public final class NettyChannelBuilder } closed = true; + protocolNegotiator.close(); if (usingSharedGroup) { SharedResourceHolder.release(Utils.DEFAULT_WORKER_EVENT_LOOP_GROUP, group); } diff --git a/netty/src/main/java/io/grpc/netty/ProtocolNegotiator.java b/netty/src/main/java/io/grpc/netty/ProtocolNegotiator.java index 132e96a03e..098ba73fb5 100644 --- a/netty/src/main/java/io/grpc/netty/ProtocolNegotiator.java +++ b/netty/src/main/java/io/grpc/netty/ProtocolNegotiator.java @@ -43,4 +43,11 @@ public interface ProtocolNegotiator { * completed successfully. */ Handler newHandler(GrpcHttp2ConnectionHandler grpcHandler); + + /** + * Releases resources held by this negotiator. Called when the Channel transitions to terminated. + * Is currently only supported on client-side; server-side protocol negotiators will not see this + * method called. + */ + void close(); } diff --git a/netty/src/main/java/io/grpc/netty/ProtocolNegotiators.java b/netty/src/main/java/io/grpc/netty/ProtocolNegotiators.java index 3a13207cb4..3decd6626b 100644 --- a/netty/src/main/java/io/grpc/netty/ProtocolNegotiators.java +++ b/netty/src/main/java/io/grpc/netty/ProtocolNegotiators.java @@ -104,6 +104,9 @@ public final class ProtocolNegotiators { return new PlaintextHandler(); } + + @Override + public void close() {} }; } @@ -117,6 +120,9 @@ public final class ProtocolNegotiators { public Handler newHandler(GrpcHttp2ConnectionHandler handler) { return new ServerTlsHandler(sslContext, handler); } + + @Override + public void close() {} }; } @@ -207,6 +213,13 @@ public final class ProtocolNegotiators { return new BufferUntilProxyTunnelledHandler( proxyHandler, negotiator.newHandler(http2Handler)); } + + // This method is not normally called, because we use httpProxy on a per-connection basis in + // NettyChannelBuilder. Instead, we expect `negotiator' to be closed by NettyTransportFactory. + @Override + public void close() { + negotiator.close(); + } } return new ProxyNegotiator(); @@ -310,6 +323,9 @@ public final class ProtocolNegotiators { }; return new BufferUntilTlsNegotiatedHandler(sslBootstrap, handler); } + + @Override + public void close() {} } /** A tuple of (host, port). */ @@ -341,6 +357,9 @@ public final class ProtocolNegotiators { new HttpClientUpgradeHandler(httpClientCodec, upgradeCodec, 1000); return new BufferingHttp2UpgradeHandler(upgrader, handler); } + + @Override + public void close() {} } /** @@ -357,6 +376,9 @@ public final class ProtocolNegotiators { public Handler newHandler(GrpcHttp2ConnectionHandler handler) { return new BufferUntilChannelActiveHandler(handler); } + + @Override + public void close() {} } private static RuntimeException unavailableException(String msg) { diff --git a/netty/src/test/java/io/grpc/netty/NettyClientTransportTest.java b/netty/src/test/java/io/grpc/netty/NettyClientTransportTest.java index 682af1b9eb..509af3300a 100644 --- a/netty/src/test/java/io/grpc/netty/NettyClientTransportTest.java +++ b/netty/src/test/java/io/grpc/netty/NettyClientTransportTest.java @@ -821,5 +821,8 @@ public class NettyClientTransportTest { this.grpcHandler = grpcHandler; return handler = new NoopHandler(grpcHandler); } + + @Override + public void close() {} } }