From c47e376083bfcf3d0966b70c030b1257982563b4 Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Wed, 12 Aug 2026 13:34:35 -0700 Subject: [PATCH] binder,cronet: Handle double-ClientTransportFactory.close() Netty/OkHttp/InProcess transports all ignore duplicate closes. We might want to change that in the future, but for now let's just get them aligned. --- .../binder/internal/BinderClientTransportFactory.java | 3 +++ .../main/java/io/grpc/cronet/CronetChannelBuilder.java | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/binder/src/main/java/io/grpc/binder/internal/BinderClientTransportFactory.java b/binder/src/main/java/io/grpc/binder/internal/BinderClientTransportFactory.java index 459e064ad9b..8188e4ecf71 100644 --- a/binder/src/main/java/io/grpc/binder/internal/BinderClientTransportFactory.java +++ b/binder/src/main/java/io/grpc/binder/internal/BinderClientTransportFactory.java @@ -101,6 +101,9 @@ public SwapChannelCredentialsResult swapChannelCredentials(ChannelCredentials ch @Override public void close() { + if (closed) { + return; + } closed = true; executorService = scheduledExecutorPool.returnObject(executorService); offloadExecutor = offloadExecutorPool.returnObject(offloadExecutor); diff --git a/cronet/src/main/java/io/grpc/cronet/CronetChannelBuilder.java b/cronet/src/main/java/io/grpc/cronet/CronetChannelBuilder.java index 7ea1bc891c2..3453d8ee405 100644 --- a/cronet/src/main/java/io/grpc/cronet/CronetChannelBuilder.java +++ b/cronet/src/main/java/io/grpc/cronet/CronetChannelBuilder.java @@ -246,6 +246,7 @@ static class CronetTransportFactory implements ClientTransportFactory { private final boolean usingSharedScheduler; private final boolean useGetForSafeMethods; private final boolean usePutForIdempotentMethods; + private boolean closed; private CronetTransportFactory( StreamBuilderFactory streamFactory, @@ -271,6 +272,9 @@ private CronetTransportFactory( @Override public ConnectionClientTransport newClientTransport( SocketAddress addr, ClientTransportOptions options, ChannelLogger channelLogger) { + if (closed) { + throw new IllegalStateException("The transport factory is closed."); + } InetSocketAddress inetSocketAddr = (InetSocketAddress) addr; return new CronetClientTransport(streamFactory, inetSocketAddr, options.getAuthority(), options.getUserAgent(), options.getEagAttributes(), executor, maxMessageSize, @@ -289,6 +293,10 @@ public SwapChannelCredentialsResult swapChannelCredentials(ChannelCredentials ch @Override public void close() { + if (closed) { + return; + } + closed = true; if (usingSharedScheduler) { SharedResourceHolder.release(GrpcUtil.TIMER_SERVICE, timeoutService); }