From f9226452c99f79fc41a04d95c1d40b0d52eac429 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Tue, 18 Nov 2025 10:22:44 -0600 Subject: [PATCH 1/2] chore: protect build timings insert for invalid enums --- coderd/provisionerdserver/provisionerdserver.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/coderd/provisionerdserver/provisionerdserver.go b/coderd/provisionerdserver/provisionerdserver.go index 56670d8a2d9e8..a5354db060d2d 100644 --- a/coderd/provisionerdserver/provisionerdserver.go +++ b/coderd/provisionerdserver/provisionerdserver.go @@ -2175,6 +2175,12 @@ func (s *server) completeWorkspaceBuildJob(ctx context.Context, job database.Pro continue } + // Scan does not guarantee validity + if !stg.Valid() { + s.Logger.Warn(ctx, "invalid stage, will fail insert based one enum", slog.F("value", t.Stage)) + continue + } + params.Stage = append(params.Stage, stg) params.Source = append(params.Source, t.Source) params.Resource = append(params.Resource, t.Resource) From 3a340d9c4ecff18bde8f12b6f67ab365033984da Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Tue, 18 Nov 2025 10:25:49 -0600 Subject: [PATCH 2/2] chore: fatal errors are fatal --- coderd/provisionerdserver/provisionerdserver.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/coderd/provisionerdserver/provisionerdserver.go b/coderd/provisionerdserver/provisionerdserver.go index a5354db060d2d..39e707a87f016 100644 --- a/coderd/provisionerdserver/provisionerdserver.go +++ b/coderd/provisionerdserver/provisionerdserver.go @@ -2190,8 +2190,11 @@ func (s *server) completeWorkspaceBuildJob(ctx context.Context, job database.Pro } _, err = db.InsertProvisionerJobTimings(ctx, params) if err != nil { - // Log error but don't fail the whole transaction for non-critical data + // A database error here will "fail" this transaction. Making this error fatal. + // If this error is seen, add checks above to validate the insert parameters. In + // production, timings should not be a fatal error. s.Logger.Warn(ctx, "failed to update provisioner job timings", slog.F("job_id", jobID), slog.Error(err)) + return xerrors.Errorf("update provisioner job timings: %w", err) } // On start, we want to ensure that workspace agents timeout statuses