From 37ef93953218566b13aaa604216aa2216ee53864 Mon Sep 17 00:00:00 2001 From: kroo-oai Date: Wed, 6 May 2026 09:20:44 -0700 Subject: [PATCH] preserve worker last_seen on sparse updates (cherry picked from commit c4f85ebbae065c007a1d879989eb0162dd026b49) --- internal/controller/api_workers.go | 4 +++- internal/tests/integration_test.go | 35 ++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/internal/controller/api_workers.go b/internal/controller/api_workers.go index b799451..4c9c8e6 100644 --- a/internal/controller/api_workers.go +++ b/internal/controller/api_workers.go @@ -104,7 +104,9 @@ func (controller *Controller) updateWorker(ctx *gin.Context) responder.Responder return responder.Error(err) } - dbWorker.LastSeen = userWorker.LastSeen + if !userWorker.LastSeen.IsZero() { + dbWorker.LastSeen = userWorker.LastSeen + } dbWorker.SchedulingPaused = userWorker.SchedulingPaused if err := txn.SetWorker(*dbWorker); err != nil { diff --git a/internal/tests/integration_test.go b/internal/tests/integration_test.go index a16d9de..f1145b8 100644 --- a/internal/tests/integration_test.go +++ b/internal/tests/integration_test.go @@ -174,6 +174,41 @@ func TestPortForwarding(t *testing.T) { require.Contains(t, string(unameOutput), cases.Title(language.English).String(runtime.GOOS)) } +func TestSparseWorkerUpdatePreservesLastSeen(t *testing.T) { + ctx := context.Background() + + devClient, _, _ := devcontroller.StartIntegrationTestEnvironmentWithAdditionalOpts( + t, + false, + nil, + true, + nil, + ) + + lastSeen := time.Now().Add(-time.Minute).UTC().Truncate(time.Microsecond) + _, err := devClient.Workers().Create(ctx, v1.Worker{ + Meta: v1.Meta{ + Name: "sparse-update-worker", + }, + LastSeen: lastSeen, + MachineID: "sparse-update-machine", + }) + require.NoError(t, err) + + _, err = devClient.Workers().Update(ctx, v1.Worker{ + Meta: v1.Meta{ + Name: "sparse-update-worker", + }, + SchedulingPaused: true, + }) + require.NoError(t, err) + + worker, err := devClient.Workers().Get(ctx, "sparse-update-worker") + require.NoError(t, err) + require.Equal(t, lastSeen, worker.LastSeen) + require.True(t, worker.SchedulingPaused) +} + // TestSchedulerHealthCheckingNonExistentWorker ensures that scheduler // will eventually fail VMs that are scheduled on a worker that was // deleted from the API.