From bc725ea7dcba17106055e4d7add3e5b2fed4ab5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Mon, 18 Jul 2022 17:56:56 +0200 Subject: [PATCH] Manager: mark worker as 'seen' when calling the `WorkerState` operation Fix workers timing out when they're `asleep`. When sleeping, the Worker will call the `WorkerState` operation to see if they have to wake up, but that didn't mark the workers as "seen". As a result, a sleeping worker would always time out. --- internal/manager/api_impl/workers.go | 5 ++++ internal/manager/api_impl/workers_test.go | 36 +++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/internal/manager/api_impl/workers.go b/internal/manager/api_impl/workers.go index 3f704f3b..2a002e40 100644 --- a/internal/manager/api_impl/workers.go +++ b/internal/manager/api_impl/workers.go @@ -180,8 +180,13 @@ func (f *Flamenco) SignOff(e echo.Context) error { // (GET /api/worker/state) func (f *Flamenco) WorkerState(e echo.Context) error { + logger := requestLogger(e) worker := requestWorkerOrPanic(e) + if err := f.workerSeen(logger, worker); err != nil { + return sendAPIError(e, http.StatusInternalServerError, "error marking worker as 'seen'") + } + if worker.StatusRequested == "" { return e.NoContent(http.StatusNoContent) } diff --git a/internal/manager/api_impl/workers_test.go b/internal/manager/api_impl/workers_test.go index d20c5c5b..a077edee 100644 --- a/internal/manager/api_impl/workers_test.go +++ b/internal/manager/api_impl/workers_test.go @@ -271,6 +271,42 @@ func TestWorkerSignoffStatusChangeRequest(t *testing.T) { assertResponseNoContent(t, echo) } +func TestWorkerState(t *testing.T) { + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + mf := newMockedFlamenco(mockCtrl) + worker := testWorker() + + mf.persistence.EXPECT().WorkerSeen(gomock.Any(), &worker).Times(2) + + // No state change requested. + { + echo := mf.prepareMockedRequest(nil) + requestWorkerStore(echo, &worker) + err := mf.flamenco.WorkerState(echo) + if assert.NoError(t, err) { + assertResponseNoContent(t, echo) + } + } + + // State change requested. + { + requestStatus := api.WorkerStatusAsleep + worker.StatusChangeRequest(requestStatus, false) + + echo := mf.prepareMockedRequest(nil) + requestWorkerStore(echo, &worker) + + err := mf.flamenco.WorkerState(echo) + if assert.NoError(t, err) { + assertResponseJSON(t, echo, http.StatusOK, api.WorkerStateChange{ + StatusRequested: requestStatus, + }) + } + } +} + func TestWorkerStateChanged(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish()