diff --git a/other/java/client/src/main/java/seaweedfs/client/FilerGrpcClient.java b/other/java/client/src/main/java/seaweedfs/client/FilerGrpcClient.java index 11ae297ef..320a754ea 100644 --- a/other/java/client/src/main/java/seaweedfs/client/FilerGrpcClient.java +++ b/other/java/client/src/main/java/seaweedfs/client/FilerGrpcClient.java @@ -56,57 +56,7 @@ public class FilerGrpcClient { channelPool = new ArrayList<>(CHANNEL_POOL_SIZE); for (int i = 0; i < CHANNEL_POOL_SIZE; i++) { - ManagedChannel channel; - if (sslContext == null) { - // Use NettyChannelBuilder with optimized HTTP/2 settings - channel = NettyChannelBuilder.forAddress(host, grpcPort) - .usePlaintext() - .maxInboundMessageSize(1024 * 1024 * 1024) - .maxInboundMetadataSize(1024 * 1024) - .flowControlWindow(16 * 1024 * 1024) - .initialFlowControlWindow(16 * 1024 * 1024) - .maxHeaderListSize(16 * 1024 * 1024) - .keepAliveTime(30, TimeUnit.SECONDS) - .keepAliveTimeout(10, TimeUnit.SECONDS) - .keepAliveWithoutCalls(true) - .withOption(io.grpc.netty.shaded.io.netty.channel.ChannelOption.SO_RCVBUF, 16 * 1024 * 1024) - .withOption(io.grpc.netty.shaded.io.netty.channel.ChannelOption.SO_SNDBUF, 16 * 1024 * 1024) - .build(); - } else if (cn.isEmpty()) { - // For TLS, we still need NettyChannelBuilder - channel = NettyChannelBuilder.forAddress(host, grpcPort) - .maxInboundMessageSize(1024 * 1024 * 1024) - .maxInboundMetadataSize(1024 * 1024) - .flowControlWindow(16 * 1024 * 1024) - .initialFlowControlWindow(16 * 1024 * 1024) - .maxHeaderListSize(16 * 1024 * 1024) - .keepAliveTime(30, TimeUnit.SECONDS) - .keepAliveTimeout(10, TimeUnit.SECONDS) - .keepAliveWithoutCalls(true) - .negotiationType(NegotiationType.TLS) - .sslContext(sslContext) - .withOption(io.grpc.netty.shaded.io.netty.channel.ChannelOption.SO_RCVBUF, 16 * 1024 * 1024) - .withOption(io.grpc.netty.shaded.io.netty.channel.ChannelOption.SO_SNDBUF, 16 * 1024 * 1024) - .build(); - } else { - // For TLS with custom authority - channel = NettyChannelBuilder.forAddress(host, grpcPort) - .maxInboundMessageSize(1024 * 1024 * 1024) - .maxInboundMetadataSize(1024 * 1024) - .flowControlWindow(16 * 1024 * 1024) - .initialFlowControlWindow(16 * 1024 * 1024) - .maxHeaderListSize(16 * 1024 * 1024) - .keepAliveTime(30, TimeUnit.SECONDS) - .keepAliveTimeout(10, TimeUnit.SECONDS) - .keepAliveWithoutCalls(true) - .negotiationType(NegotiationType.TLS) - .overrideAuthority(cn) - .sslContext(sslContext) - .withOption(io.grpc.netty.shaded.io.netty.channel.ChannelOption.SO_RCVBUF, 16 * 1024 * 1024) - .withOption(io.grpc.netty.shaded.io.netty.channel.ChannelOption.SO_SNDBUF, 16 * 1024 * 1024) - .build(); - } - channelPool.add(channel); + channelPool.add(createChannelBuilder(host, grpcPort, sslContext, cn).build()); } // Get filer configuration using first channel @@ -120,6 +70,34 @@ public class FilerGrpcClient { } + /** + * Creates a NettyChannelBuilder with common gRPC configuration. + * Supports plaintext and TLS modes with optional authority override. + */ + private NettyChannelBuilder createChannelBuilder(String host, int grpcPort, SslContext sslContext, String cn) { + NettyChannelBuilder builder = NettyChannelBuilder.forAddress(host, grpcPort) + .maxInboundMessageSize(1024 * 1024 * 1024) + .maxInboundMetadataSize(1024 * 1024) + .flowControlWindow(16 * 1024 * 1024) + .initialFlowControlWindow(16 * 1024 * 1024) + .maxHeaderListSize(16 * 1024 * 1024) + .keepAliveTime(30, TimeUnit.SECONDS) + .keepAliveTimeout(10, TimeUnit.SECONDS) + .keepAliveWithoutCalls(true) + .withOption(io.grpc.netty.shaded.io.netty.channel.ChannelOption.SO_RCVBUF, 16 * 1024 * 1024) + .withOption(io.grpc.netty.shaded.io.netty.channel.ChannelOption.SO_SNDBUF, 16 * 1024 * 1024); + + if (sslContext == null) { + builder.usePlaintext(); + } else { + builder.negotiationType(NegotiationType.TLS).sslContext(sslContext); + if (!cn.isEmpty()) { + builder.overrideAuthority(cn); + } + } + return builder; + } + // Get a channel from the pool using round-robin private ManagedChannel getChannel() { int raw = channelIndex.getAndIncrement();