@@ -220,16 +220,29 @@ func WorkspaceAgentScriptTimings(t testing.TB, db database.Store, script databas
220
220
}
221
221
222
222
func WorkspaceAgentScriptTiming (t testing.TB , db database.Store , orig database.WorkspaceAgentScriptTiming ) database.WorkspaceAgentScriptTiming {
223
- timing , err := db .InsertWorkspaceAgentScriptTimings (genCtx , database.InsertWorkspaceAgentScriptTimingsParams {
224
- StartedAt : takeFirst (orig .StartedAt , dbtime .Now ()),
225
- EndedAt : takeFirst (orig .EndedAt , dbtime .Now ()),
226
- Stage : takeFirst (orig .Stage , database .WorkspaceAgentScriptTimingStageStart ),
227
- ScriptID : takeFirst (orig .ScriptID , uuid .New ()),
228
- ExitCode : takeFirst (orig .ExitCode , 0 ),
229
- Status : takeFirst (orig .Status , database .WorkspaceAgentScriptTimingStatusOk ),
230
- })
231
- require .NoError (t , err , "insert workspace agent script" )
232
- return timing
223
+ // retry a few times in case of a unique constraint violation
224
+ for i := 0 ; i < 10 ; i ++ {
225
+ timing , err := db .InsertWorkspaceAgentScriptTimings (genCtx , database.InsertWorkspaceAgentScriptTimingsParams {
226
+ StartedAt : takeFirst (orig .StartedAt , dbtime .Now ()),
227
+ EndedAt : takeFirst (orig .EndedAt , dbtime .Now ()),
228
+ Stage : takeFirst (orig .Stage , database .WorkspaceAgentScriptTimingStageStart ),
229
+ ScriptID : takeFirst (orig .ScriptID , uuid .New ()),
230
+ ExitCode : takeFirst (orig .ExitCode , 0 ),
231
+ Status : takeFirst (orig .Status , database .WorkspaceAgentScriptTimingStatusOk ),
232
+ })
233
+ if err == nil {
234
+ return timing
235
+ }
236
+ // Some tests run WorkspaceAgentScriptTiming in a loop and run into
237
+ // a unique violation - 2 rows get the same started_at value.
238
+ if (database .IsUniqueViolation (err , database .UniqueWorkspaceAgentScriptTimingsScriptIDStartedAtKey ) && orig .StartedAt == time.Time {}) {
239
+ // Wait 1 millisecond so dbtime.Now() changes
240
+ time .Sleep (time .Millisecond * 1 )
241
+ continue
242
+ }
243
+ require .NoError (t , err , "insert workspace agent script" )
244
+ }
245
+ panic ("failed to insert workspace agent script timing" )
233
246
}
234
247
235
248
func Workspace (t testing.TB , db database.Store , orig database.WorkspaceTable ) database.WorkspaceTable {
0 commit comments