From e797a27d4e77aef8a49dfb8e2d2692c55c8a9ad5 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Sun, 5 Jul 2026 22:38:44 -0600 Subject: [PATCH] fix(actions): release claimed task if context is cancelled during `FetchTask` (#38343) When a runner's `FetchTask` request context is cancelled after the job is claimed but before the task reaches the runner (e.g. request timeout), the job was left referencing a running task no runner ever executes, so it stayed unpickable. Fix: Check the context after assembling the task and release the task so the job returns to waiting status for another runner. --- services/actions/task.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/services/actions/task.go b/services/actions/task.go index a76a981b50a..f9e8e2d018d 100644 --- a/services/actions/task.go +++ b/services/actions/task.go @@ -76,6 +76,15 @@ func PickTask(ctx context.Context, runner *actions_model.ActionRunner) (*runnerv NotifyWorkflowRunStatusUpdateWithReload(ctx, job.RepoID, job.RunID) } + // The job is claimed and its payload assembled, but if the request context was cancelled meanwhile, response can no longer reach the runner. + // Release the claim so another runner can pick the job up. + if err := ctx.Err(); err != nil { + if relErr := actions_model.ReleaseTaskForRunner(ctx, t); relErr != nil { + log.Error("ReleaseTaskForRunner [task_id: %d]: %v", t.ID, relErr) + } + return nil, false, err + } + return task, true, nil }