From 39e7f11a96d53624c0adca9b462a2aa14c6baa8c Mon Sep 17 00:00:00 2001 From: Layue13 Date: Sat, 24 Oct 2026 01:05:53 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=85=B3=E9=97=AD=E7=9B=91=E5=90=AC?= =?UTF-8?q?=E5=99=A8=E6=97=B6=E5=90=8C=E6=97=B6=E5=85=B3=E9=97=AD=20boss?= =?UTF-8?q?=20=E4=B8=8E=20worker=20=E4=BA=8B=E4=BB=B6=E5=BE=AA=E7=8E=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ProxySessionListener.close() 原先等 boss 组 shutdownGracefully 完成后才开始关闭 worker 组。两组各自要等 2 秒静默期,所以每次 close 至少约 4 秒。测试用 close().get(5, SECONDS) 收尾,在较慢的 Gitea runner 上 SessionTransferTest 有两个 用例因此超时(run 14129);本机 SessionTransferTest 每个用例也都在 4.16 秒以上,最慢 5.18 秒。 改为同时开始关闭两组,两者都结束后再完成 shutdown。各组仍保留默认静默期,关闭前已 提交的任务照常执行。本机 SessionTransferTest 单用例中位数 4.19 秒降到 2.15 秒,最慢 5.18 秒降到 3.13 秒。 Co-Authored-By: Claude Opus 5.5 --- .../dev/moonbridge/core/session/ProxySessionListener.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/proxy/core/src/main/java/dev/moonbridge/core/session/ProxySessionListener.java b/proxy/core/src/main/java/dev/moonbridge/core/session/ProxySessionListener.java index f176d79..0f3a154 100644 --- a/proxy/core/src/main/java/dev/moonbridge/core/session/ProxySessionListener.java +++ b/proxy/core/src/main/java/dev/moonbridge/core/session/ProxySessionListener.java @@ -34,6 +34,7 @@ import io.netty.channel.socket.SocketChannel; import io.netty.resolver.AddressResolverGroup; import io.netty.resolver.dns.DnsAddressResolverGroup; import io.netty.resolver.dns.DnsNameResolverBuilder; +import io.netty.util.concurrent.Future; import java.net.InetSocketAddress; import java.net.SocketAddress; @@ -512,7 +513,10 @@ public final class ProxySessionListener implements Players { allSessions.forEach(session -> session.closeBecause("proxy shutting down")); backendResolver.close(); shutdown = new CompletableFuture<>(); - boss.shutdownGracefully().addListener(first -> workers.shutdownGracefully().addListener(second -> { + // Start both at once: each group waits out its own quiet period, so draining them in turn doubled the close time. + Future bossStopped = boss.shutdownGracefully(); + Future workersStopped = workers.shutdownGracefully(); + bossStopped.addListener(first -> workersStopped.addListener(second -> { if (first.isSuccess() && second.isSuccess()) shutdown.complete(null); else shutdown.completeExceptionally(first.isSuccess() ? second.cause() : first.cause()); }));