From 1130a55ef583414bc2dc68463781dd4dd4ad55d0 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 5 Feb 2026 04:09:57 +0000 Subject: [PATCH] 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 }