mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
fix(coderd): ensure agent timings are non-zero on insert (#18065)
Relates to https://github.com/coder/coder/issues/15432 Ensures that no workspace build timings with zero values for started_at or ended_at are inserted into the DB or returned from the API.
This commit is contained in:
@@ -1741,8 +1741,15 @@ func (s *server) completeWorkspaceBuildJob(ctx context.Context, job database.Pro
|
||||
JobID: jobID,
|
||||
}
|
||||
for _, t := range jobType.WorkspaceBuild.Timings {
|
||||
if t.Start == nil || t.End == nil {
|
||||
s.Logger.Warn(ctx, "timings entry has nil start or end time", slog.F("entry", t.String()))
|
||||
start := t.GetStart()
|
||||
if !start.IsValid() || start.AsTime().IsZero() {
|
||||
s.Logger.Warn(ctx, "timings entry has nil or zero start time", slog.F("job_id", job.ID.String()), slog.F("workspace_id", workspace.ID), slog.F("workspace_build_id", workspaceBuild.ID), slog.F("user_id", workspace.OwnerID))
|
||||
continue
|
||||
}
|
||||
|
||||
end := t.GetEnd()
|
||||
if !end.IsValid() || end.AsTime().IsZero() {
|
||||
s.Logger.Warn(ctx, "timings entry has nil or zero end time, skipping", slog.F("job_id", job.ID.String()), slog.F("workspace_id", workspace.ID), slog.F("workspace_build_id", workspaceBuild.ID), slog.F("user_id", workspace.OwnerID))
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -1771,7 +1778,7 @@ func (s *server) completeWorkspaceBuildJob(ctx context.Context, job database.Pro
|
||||
// after being started.
|
||||
//
|
||||
// Agent timeouts could be minutes apart, resulting in an unresponsive
|
||||
// experience, so we'll notify after every unique timeout seconds.
|
||||
// experience, so we'll notify after every unique timeout seconds
|
||||
if !input.DryRun && workspaceBuild.Transition == database.WorkspaceTransitionStart && len(agentTimeouts) > 0 {
|
||||
timeouts := maps.Keys(agentTimeouts)
|
||||
slices.Sort(timeouts)
|
||||
|
||||
@@ -1301,14 +1301,57 @@ func TestCompleteJob(t *testing.T) {
|
||||
Name: "test-workspace-resource",
|
||||
Type: "aws_instance",
|
||||
}},
|
||||
Timings: []*sdkproto.Timing{{
|
||||
Stage: "test",
|
||||
Source: "test-source",
|
||||
Resource: "test-resource",
|
||||
Action: "test-action",
|
||||
Start: timestamppb.Now(),
|
||||
End: timestamppb.Now(),
|
||||
}},
|
||||
Timings: []*sdkproto.Timing{
|
||||
{
|
||||
Stage: "test",
|
||||
Source: "test-source",
|
||||
Resource: "test-resource",
|
||||
Action: "test-action",
|
||||
Start: timestamppb.Now(),
|
||||
End: timestamppb.Now(),
|
||||
},
|
||||
{
|
||||
Stage: "test2",
|
||||
Source: "test-source2",
|
||||
Resource: "test-resource2",
|
||||
Action: "test-action2",
|
||||
// Start: omitted
|
||||
// End: omitted
|
||||
},
|
||||
{
|
||||
Stage: "test3",
|
||||
Source: "test-source3",
|
||||
Resource: "test-resource3",
|
||||
Action: "test-action3",
|
||||
Start: timestamppb.Now(),
|
||||
End: nil,
|
||||
},
|
||||
{
|
||||
Stage: "test3",
|
||||
Source: "test-source3",
|
||||
Resource: "test-resource3",
|
||||
Action: "test-action3",
|
||||
Start: nil,
|
||||
End: timestamppb.Now(),
|
||||
},
|
||||
{
|
||||
Stage: "test4",
|
||||
Source: "test-source4",
|
||||
Resource: "test-resource4",
|
||||
Action: "test-action4",
|
||||
Start: timestamppb.New(time.Time{}),
|
||||
End: timestamppb.Now(),
|
||||
},
|
||||
{
|
||||
Stage: "test5",
|
||||
Source: "test-source5",
|
||||
Resource: "test-resource5",
|
||||
Action: "test-action5",
|
||||
Start: timestamppb.Now(),
|
||||
End: timestamppb.New(time.Time{}),
|
||||
},
|
||||
nil, // nil timing should be ignored
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user