Browse Source

fix: prevent deadlock when stream error occurs - make cmds send non-blocking

If managerLoop is blocked (e.g., waiting on regWait), a blocking send to cmds
will deadlock handleIncoming. Make the send non-blocking to prevent this.
pull/7838/head
Chris Lu 2 months ago
parent
commit
3ebbd25a4b
  1. 8
      weed/worker/client.go

8
weed/worker/client.go

@ -446,8 +446,12 @@ func handleIncoming(
default: default:
} }
// Report the failure as a command to the managerLoop (blocking)
cmds <- grpcCommand{action: ActionStreamError, data: err}
// Report the failure as a command to the managerLoop (non-blocking to prevent deadlock)
select {
case cmds <- grpcCommand{action: ActionStreamError, data: err}:
default:
glog.V(2).Infof("Manager busy, stream error not queued: %v", err)
}
// Exit the main handler loop // Exit the main handler loop
glog.V(1).Infof("INCOMING HANDLER STOPPED: Worker %s stopping incoming handler due to stream error", workerID) glog.V(1).Infof("INCOMING HANDLER STOPPED: Worker %s stopping incoming handler due to stream error", workerID)

Loading…
Cancel
Save