@@ -3158,36 +3158,42 @@ func TestGarbageCollect(t *testing.T) {
31583158 gcTestEvent .Clear ()
31593159 numWorkflows := 10
31603160
3161- // Execute first batch of workflows
3161+ // Start blocked workflow BEFORE cutoff to verify pending workflows are preserved
3162+ blockedHandle , err := RunAsWorkflow (dbosCtx , gcBlockedWorkflow , gcTestEvent )
3163+ require .NoError (t , err , "failed to start blocked workflow" )
3164+
3165+ // Execute first batch of workflows (before cutoff)
3166+ var beforeCutoffHandles []WorkflowHandle [int ]
31623167 for i := range numWorkflows {
31633168 handle , err := RunAsWorkflow (dbosCtx , gcTestWorkflow , i )
31643169 require .NoError (t , err , "failed to start test workflow %d" , i )
31653170 result , err := handle .GetResult ()
31663171 require .NoError (t , err , "failed to get result from test workflow %d" , i )
31673172 require .Equal (t , i , result , "expected result %d, got %d" , i , result )
3173+ beforeCutoffHandles = append (beforeCutoffHandles , handle )
31683174 }
31693175
3170- // Wait a second to ensure time separation
3171- time .Sleep (1 * time .Second )
3176+ // Wait to ensure clear time separation between batches
3177+ time .Sleep (500 * time .Millisecond )
31723178 cutoffTime := time .Now ()
3173-
3174- // Start blocked workflow after cutoff
3175- blockedHandle , err := RunAsWorkflow (dbosCtx , gcBlockedWorkflow , gcTestEvent )
3176- require .NoError (t , err , "failed to start blocked workflow" )
3179+ // Additional small delay to ensure cutoff is after all first batch workflows
3180+ time .Sleep (100 * time .Millisecond )
31773181
31783182 // Execute second batch of workflows after cutoff
3183+ var afterCutoffHandles []WorkflowHandle [int ]
31793184 for i := numWorkflows ; i < numWorkflows * 2 ; i ++ {
31803185 handle , err := RunAsWorkflow (dbosCtx , gcTestWorkflow , i )
31813186 require .NoError (t , err , "failed to start test workflow %d" , i )
31823187 result , err := handle .GetResult ()
31833188 require .NoError (t , err , "failed to get result from test workflow %d" , i )
31843189 require .Equal (t , i , result , "expected result %d, got %d" , i , result )
3190+ afterCutoffHandles = append (afterCutoffHandles , handle )
31853191 }
31863192
3187- // Verify exactly 21 workflows exist before GC (10 + 1 blocked + 10)
3193+ // Verify exactly 21 workflows exist before GC (1 blocked + 10 old + 10 new )
31883194 workflows , err := ListWorkflows (dbosCtx )
31893195 require .NoError (t , err , "failed to list workflows" )
3190- require .Equal (t , 21 , len (workflows ), "expected exactly 21 workflows before GC (10 old + 1 blocked + 10 new)" )
3196+ require .Equal (t , 21 , len (workflows ), "expected exactly 21 workflows before GC (1 blocked + 10 old + 10 new)" )
31913197
31923198 // Garbage collect workflows completed before cutoff time
31933199 cutoffTimestamp := cutoffTime .UnixMilli ()
@@ -3201,26 +3207,26 @@ func TestGarbageCollect(t *testing.T) {
32013207 require .NoError (t , err , "failed to list workflows after time-based GC" )
32023208 require .Equal (t , 11 , len (workflows ), "expected exactly 11 workflows after time-based GC (1 blocked + 10 new)" )
32033209
3204- // Verify blocked workflow still exists
3205- found := false
3210+ // Create a map of remaining workflow IDs for easy lookup
3211+ remainingIDs := make ( map [ string ] bool )
32063212 for _ , wf := range workflows {
3207- if wf .ID == blockedHandle .GetWorkflowID () {
3208- found = true
3209- require .Equal (t , WorkflowStatusPending , wf .Status , "blocked workflow should still be pending" )
3210- break
3211- }
3213+ remainingIDs [wf .ID ] = true
32123214 }
3213- require .True (t , found , "blocked workflow should still exist after time-based GC" )
32143215
3215- // Verify all remaining completed workflows were created after cutoff (excluding blocked)
3216- completedAfterCutoff := 0
3217- for _ , wf := range workflows {
3218- if wf .ID != blockedHandle .GetWorkflowID () && wf .Status == WorkflowStatusSuccess {
3219- require .True (t , wf .CreatedAt .After (cutoffTime ), "completed workflow should be from after the cutoff time" )
3220- completedAfterCutoff ++
3221- }
3216+ // Verify blocked workflow still exists (even though it was created before cutoff)
3217+ require .True (t , remainingIDs [blockedHandle .GetWorkflowID ()], "blocked workflow should still exist after GC" )
3218+
3219+ // Verify that all workflows created before cutoff were deleted (except the blocked one)
3220+ for _ , handle := range beforeCutoffHandles {
3221+ wfID := handle .GetWorkflowID ()
3222+ require .False (t , remainingIDs [wfID ], "workflow created before cutoff (ID: %s) should have been deleted" , wfID )
3223+ }
3224+
3225+ // Verify that all workflows created after cutoff were preserved
3226+ for _ , handle := range afterCutoffHandles {
3227+ wfID := handle .GetWorkflowID ()
3228+ require .True (t , remainingIDs [wfID ], "workflow created after cutoff (ID: %s) should have been preserved" , wfID )
32223229 }
3223- require .Equal (t , 10 , completedAfterCutoff , "expected exactly 10 completed workflows after cutoff" )
32243230
32253231 // Complete the blocked workflow
32263232 gcTestEvent .Set ()
0 commit comments