Fail marks a task as failed with a reason and closes its result channel.
(sessionID string, taskID uint32, reason string)
| 217 | |
| 218 | // Fail marks a task as failed with a reason and closes its result channel. |
| 219 | func (tm *TaskManager) Fail(sessionID string, taskID uint32, reason string) { |
| 220 | task := tm.Get(sessionID, taskID) |
| 221 | if task == nil { |
| 222 | return |
| 223 | } |
| 224 | task.mu.Lock() |
| 225 | defer task.mu.Unlock() |
| 226 | |
| 227 | if task.State == TaskCompleted || task.State == TaskFailed { |
| 228 | return // already terminal |
| 229 | } |
| 230 | task.State = TaskFailed |
| 231 | task.Error = reason |
| 232 | task.UpdatedAt = time.Now() |
| 233 | close(task.resultCh) |
| 234 | } |
| 235 | |
| 236 | // StartSessionListener ensures a single subscriber exists for the given session. |
| 237 | // The subscriber fans out incoming results to per-task channels based on TaskID. |