From 265cd0a50e511747c8f6849cb8a04eaf144ecd84 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 5 Feb 2026 04:06:46 +0000 Subject: [PATCH 1/2] Revert "fix(backend): enable noDelay for relay connector to fix chain failover" This reverts commit 51cbd4b9deac4ac2b3b7beb6e8432aa4826993b4. --- .../src/main/java/com/admin/common/utils/GostUtil.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/springboot-backend/src/main/java/com/admin/common/utils/GostUtil.java b/springboot-backend/src/main/java/com/admin/common/utils/GostUtil.java index 95761d0..e681359 100644 --- a/springboot-backend/src/main/java/com/admin/common/utils/GostUtil.java +++ b/springboot-backend/src/main/java/com/admin/common/utils/GostUtil.java @@ -51,10 +51,6 @@ public class GostUtil { JSONObject connector = new JSONObject(); connector.put("type", "relay"); - // 启用 noDelay 以确保连接错误能立即传播,使故障转移正常工作 - JSONObject connectorMetadata = new JSONObject(); - connectorMetadata.put("nodelay", true); - connector.put("metadata", connectorMetadata); Node node_info = node_s.get(chainTunnel.getNodeId()); JSONObject node = new JSONObject(); From 1130a55ef583414bc2dc68463781dd4dd4ad55d0 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 5 Feb 2026 04:09:57 +0000 Subject: [PATCH 2/2] fix(gost): mark node failed when transport detects relay error When using relay connector with noDelay=false (default), connection errors to the final target are deferred until first read/write during Transport(). Previously the Transport() return value was ignored, causing the marker to never be called for unreachable targets. Now we capture the Transport() error and mark the node as failed, enabling failover for subsequent connections. --- go-gost/x/handler/forward/local/handler.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/go-gost/x/handler/forward/local/handler.go b/go-gost/x/handler/forward/local/handler.go index 20de1de..db49609 100644 --- a/go-gost/x/handler/forward/local/handler.go +++ b/go-gost/x/handler/forward/local/handler.go @@ -252,7 +252,14 @@ func (h *forwardHandler) Handle(ctx context.Context, conn net.Conn, opts ...hand } defer cc.Close() - xnet.Transport(conn, cc) + if err := xnet.Transport(conn, cc); err != nil { + if marker := target.Marker(); marker != nil { + marker.Mark() + h.options.Logger.Debugf("[handler.transport] transport failed, marked node=%s count=%d err=%v", + target.Addr, marker.Count(), err) + } + return err + } return nil }