From 7e0664aee9bc5a6d511e9dd74d81af21b6d2a5d4 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 22 Dec 2025 00:48:34 -0800 Subject: [PATCH] Prevent goroutine leaks by adding timeouts to blocking cmds sends Add 2-second timeouts to both handleStreamError and the async fallback goroutine when sending ActionStreamError to cmds channel. This prevents the handleOutgoing and handleIncoming goroutines from blocking indefinitely if the managerLoop is no longer receiving (e.g., during shutdown), preventing resource leaks. --- weed/worker/client.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/weed/worker/client.go b/weed/worker/client.go index 3eb892e86..e0ae719b5 100644 --- a/weed/worker/client.go +++ b/weed/worker/client.go @@ -360,7 +360,11 @@ func handleOutgoing( handleStreamError := func(err error) { if err != nil { glog.Errorf("Failed to send message to admin: %v", err) - cmds <- grpcCommand{action: ActionStreamError, data: err} + select { + case cmds <- grpcCommand{action: ActionStreamError, data: err}: + case <-time.After(2 * time.Second): + glog.Warningf("Failed to send stream error to manager from outgoing handler, channel blocked: %v", err) + } } } @@ -470,7 +474,11 @@ func handleIncoming( default: glog.V(2).Infof("Manager busy, queuing stream error asynchronously: %v", err) go func(e error) { - cmds <- grpcCommand{action: ActionStreamError, data: e} + select { + case cmds <- grpcCommand{action: ActionStreamError, data: e}: + case <-time.After(2 * time.Second): + glog.Warningf("Failed to send stream error to manager, channel blocked: %v", e) + } }(err) }