From 4d2200bb0c32be843c9479373f47042355af7b5a Mon Sep 17 00:00:00 2001 From: Eveline Anderson Date: Fri, 2 Jun 2023 22:50:07 +0200 Subject: [PATCH] Fix #99549: Remember Previous Status (#104217) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix #99549: When sending Workers offline, remember their previous status When the status of a worker goes offline, the Manager will now make the status of the worker to be remembered once it goes back online. So when the Worker makes this status change (so for example `X → offline`), Manager should immediately set `StatusRequested = "X" ` once it goes online. Reviewed-on: https://projects.blender.org/studio/flamenco/pulls/104217 --- .vscode/settings.json | 5 +++-- internal/manager/api_impl/workers.go | 5 +++++ internal/manager/api_impl/workers_test.go | 21 +++++++++++++++------ 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 0856495c..0800dfa2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -13,9 +13,10 @@ }, "[yaml]": { "editor.autoIndent": "keep", - "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[vue]": { - "editor.defaultFormatter": "Vue.volar", + "editor.defaultFormatter": "Vue.volar" }, + "editor.formatOnSave": true } diff --git a/internal/manager/api_impl/workers.go b/internal/manager/api_impl/workers.go index 99dbe7a4..6626992d 100644 --- a/internal/manager/api_impl/workers.go +++ b/internal/manager/api_impl/workers.go @@ -163,6 +163,11 @@ func (f *Flamenco) SignOff(e echo.Context) error { w.StatusChangeClear() } + // Remember the previous status if an initial status exists + if w.StatusRequested == "" { + w.StatusChangeRequest(prevStatus, false) + } + // Pass a generic background context, as these changes should be stored even // when the HTTP connection is aborted. bgCtx, bgCtxCancel := bgContext() diff --git a/internal/manager/api_impl/workers_test.go b/internal/manager/api_impl/workers_test.go index d4d54db9..439fba41 100644 --- a/internal/manager/api_impl/workers_test.go +++ b/internal/manager/api_impl/workers_test.go @@ -244,6 +244,10 @@ func TestWorkerSignoffTaskRequeue(t *testing.T) { Name: worker.Name, PreviousStatus: &prevStatus, Status: api.WorkerStatusOffline, + StatusChange: &api.WorkerStatusChangeRequest{ + IsLazy: false, + Status: api.WorkerStatusAwake, + }, Updated: worker.UpdatedAt, Version: worker.Software, }) @@ -255,11 +259,11 @@ func TestWorkerSignoffTaskRequeue(t *testing.T) { assert.Equal(t, http.StatusNoContent, resp.StatusCode) } -func TestWorkerSignoffStatusChangeRequest(t *testing.T) { +func TestWorkerRememberPreviousStatus(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() - mf := newMockedFlamenco(mockCtrl) + worker := testWorker() worker.Status = api.WorkerStatusAwake worker.StatusChangeRequest(api.WorkerStatusOffline, true) @@ -269,25 +273,30 @@ func TestWorkerSignoffStatusChangeRequest(t *testing.T) { Name: worker.Name, PreviousStatus: ptr(api.WorkerStatusAwake), Status: api.WorkerStatusOffline, + StatusChange: &api.WorkerStatusChangeRequest{ + IsLazy: false, + Status: api.WorkerStatusAwake, + }, Updated: worker.UpdatedAt, Version: worker.Software, }) - // Expect the Worker to be saved with the status change removed. savedWorker := worker savedWorker.Status = api.WorkerStatusOffline - savedWorker.StatusChangeClear() + savedWorker.StatusRequested = api.WorkerStatusAwake + savedWorker.LazyStatusRequest = false mf.persistence.EXPECT().SaveWorkerStatus(gomock.Any(), &savedWorker).Return(nil) - mf.stateMachine.EXPECT().RequeueActiveTasksOfWorker(gomock.Any(), &worker, "worker signed off").Return(nil) mf.persistence.EXPECT().WorkerSeen(gomock.Any(), &worker) - // Perform the request echo := mf.prepareMockedRequest(nil) requestWorkerStore(echo, &worker) err := mf.flamenco.SignOff(echo) assert.NoError(t, err) assertResponseNoContent(t, echo) + + assert.Equal(t, api.WorkerStatusAwake, worker.StatusRequested) + assert.Equal(t, false, worker.LazyStatusRequest) } func TestWorkerState(t *testing.T) {