diff --git a/coderd/database/dbgen/dbgen.go b/coderd/database/dbgen/dbgen.go index 34ebc61749..ae898d4f1f 100644 --- a/coderd/database/dbgen/dbgen.go +++ b/coderd/database/dbgen/dbgen.go @@ -220,16 +220,29 @@ func WorkspaceAgentScriptTimings(t testing.TB, db database.Store, script databas } func WorkspaceAgentScriptTiming(t testing.TB, db database.Store, orig database.WorkspaceAgentScriptTiming) database.WorkspaceAgentScriptTiming { - timing, err := db.InsertWorkspaceAgentScriptTimings(genCtx, database.InsertWorkspaceAgentScriptTimingsParams{ - StartedAt: takeFirst(orig.StartedAt, dbtime.Now()), - EndedAt: takeFirst(orig.EndedAt, dbtime.Now()), - Stage: takeFirst(orig.Stage, database.WorkspaceAgentScriptTimingStageStart), - ScriptID: takeFirst(orig.ScriptID, uuid.New()), - ExitCode: takeFirst(orig.ExitCode, 0), - Status: takeFirst(orig.Status, database.WorkspaceAgentScriptTimingStatusOk), - }) - require.NoError(t, err, "insert workspace agent script") - return timing + // retry a few times in case of a unique constraint violation + for i := 0; i < 10; i++ { + timing, err := db.InsertWorkspaceAgentScriptTimings(genCtx, database.InsertWorkspaceAgentScriptTimingsParams{ + StartedAt: takeFirst(orig.StartedAt, dbtime.Now()), + EndedAt: takeFirst(orig.EndedAt, dbtime.Now()), + Stage: takeFirst(orig.Stage, database.WorkspaceAgentScriptTimingStageStart), + ScriptID: takeFirst(orig.ScriptID, uuid.New()), + ExitCode: takeFirst(orig.ExitCode, 0), + Status: takeFirst(orig.Status, database.WorkspaceAgentScriptTimingStatusOk), + }) + if err == nil { + return timing + } + // Some tests run WorkspaceAgentScriptTiming in a loop and run into + // a unique violation - 2 rows get the same started_at value. + if (database.IsUniqueViolation(err, database.UniqueWorkspaceAgentScriptTimingsScriptIDStartedAtKey) && orig.StartedAt == time.Time{}) { + // Wait 1 millisecond so dbtime.Now() changes + time.Sleep(time.Millisecond * 1) + continue + } + require.NoError(t, err, "insert workspace agent script") + } + panic("failed to insert workspace agent script timing") } func Workspace(t testing.TB, db database.Store, orig database.WorkspaceTable) database.WorkspaceTable { diff --git a/coderd/database/dbpurge/dbpurge_test.go b/coderd/database/dbpurge/dbpurge_test.go index 4b0fe26a03..671c65c687 100644 --- a/coderd/database/dbpurge/dbpurge_test.go +++ b/coderd/database/dbpurge/dbpurge_test.go @@ -54,7 +54,7 @@ func TestPurge(t *testing.T) { //nolint:paralleltest // It uses LockIDDBPurge. func TestDeleteOldWorkspaceAgentStats(t *testing.T) { - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) defer cancel() now := dbtime.Now() diff --git a/enterprise/tailnet/pgcoord_test.go b/enterprise/tailnet/pgcoord_test.go index c61e5ed2a1..1971534f44 100644 --- a/enterprise/tailnet/pgcoord_test.go +++ b/enterprise/tailnet/pgcoord_test.go @@ -921,7 +921,7 @@ func TestPGCoordinatorPropogatedPeerContext(t *testing.T) { t.Skip("test only with postgres") } - ctx := testutil.Context(t, testutil.WaitShort) + ctx := testutil.Context(t, testutil.WaitMedium) store, ps := dbtestutil.NewDB(t) logger := testutil.Logger(t) diff --git a/testutil/duration_windows.go b/testutil/duration_windows.go index 4c3b85e671..d363dae2ba 100644 --- a/testutil/duration_windows.go +++ b/testutil/duration_windows.go @@ -7,10 +7,10 @@ import "time" // // Windows durations are adjusted for slow CI workers. const ( - WaitShort = 15 * time.Second - WaitMedium = 20 * time.Second - WaitLong = 35 * time.Second - WaitSuperLong = 120 * time.Second + WaitShort = 30 * time.Second + WaitMedium = 40 * time.Second + WaitLong = 70 * time.Second + WaitSuperLong = 240 * time.Second ) // Constants for delaying repeated operations, e.g. in @@ -18,7 +18,7 @@ const ( // // Windows durations are adjusted for slow CI workers. const ( - IntervalFast = 50 * time.Millisecond - IntervalMedium = 500 * time.Millisecond - IntervalSlow = 2 * time.Second + IntervalFast = 100 * time.Millisecond + IntervalMedium = 1000 * time.Millisecond + IntervalSlow = 4 * time.Second )