diff --git a/internal/manager/api_impl/workers.go b/internal/manager/api_impl/workers.go index f5737acd..9363df81 100644 --- a/internal/manager/api_impl/workers.go +++ b/internal/manager/api_impl/workers.go @@ -241,16 +241,22 @@ func (f *Flamenco) WorkerStateChanged(e echo.Context) error { bgCtx, bgCtxCancel := bgContext() defer bgCtxCancel() - err = f.persist.SaveWorkerStatus(bgCtx, w) - if err != nil { + if err := f.persist.SaveWorkerStatus(bgCtx, w); err != nil { logger.Warn().Err(err). Str("newStatus", string(w.Status)). Msg("error storing Worker in database") - return sendAPIError(e, http.StatusInternalServerError, "error storing worker in database") } - if err := f.workerSeen(logger, w); err != nil { - return sendAPIError(e, http.StatusInternalServerError, "error storing worker 'last seen' timestamp in database") + // Any error has already been logged, and the rest of the code should also just run. + _ = f.workerSeen(logger, w) + + // Re-queue all tasks (should be only one) this worker is now working on. + if prevStatus == api.WorkerStatusAwake && w.Status != api.WorkerStatusAwake { + err := f.stateMachine.RequeueActiveTasksOfWorker(bgCtx, w, + fmt.Sprintf("worker changed status to '%s'", w.Status)) + if err != nil { + logger.Warn().Err(err).Msg("error re-queueing worker tasks after it changed to non-awake status") + } } update := webupdates.NewWorkerUpdate(w) diff --git a/internal/manager/api_impl/workers_test.go b/internal/manager/api_impl/workers_test.go index de84b56e..972bdc4a 100644 --- a/internal/manager/api_impl/workers_test.go +++ b/internal/manager/api_impl/workers_test.go @@ -316,7 +316,7 @@ func TestWorkerStateChanged(t *testing.T) { mf := newMockedFlamenco(mockCtrl) worker := testWorker() - worker.Status = api.WorkerStatusStarting + worker.Status = api.WorkerStatusAwake prevStatus := worker.Status // Expect a broadcast of the change @@ -324,20 +324,21 @@ func TestWorkerStateChanged(t *testing.T) { Id: worker.UUID, Name: worker.Name, PreviousStatus: &prevStatus, - Status: api.WorkerStatusAwake, + Status: api.WorkerStatusAsleep, Updated: worker.UpdatedAt, Version: worker.Software, }) // Expect the Worker to be saved with the new status savedWorker := worker - savedWorker.Status = api.WorkerStatusAwake + savedWorker.Status = api.WorkerStatusAsleep mf.persistence.EXPECT().SaveWorkerStatus(gomock.Any(), &savedWorker).Return(nil) mf.persistence.EXPECT().WorkerSeen(gomock.Any(), &worker) + mf.stateMachine.EXPECT().RequeueActiveTasksOfWorker(gomock.Any(), &worker, "worker changed status to 'asleep'") // Perform the request echo := mf.prepareMockedJSONRequest(api.WorkerStateChanged{ - Status: api.WorkerStatusAwake, + Status: api.WorkerStatusAsleep, }) requestWorkerStore(echo, &worker) err := mf.flamenco.WorkerStateChanged(echo)