ExpireTaskBlocks finalizes expired transient blocks through service-owned transitions.
( ctx context.Context, now time.Time, actor ActorContext, )
| 369 | |
| 370 | // ExpireTaskBlocks finalizes expired transient blocks through service-owned transitions. |
| 371 | func (m *Service) ExpireTaskBlocks( |
| 372 | ctx context.Context, |
| 373 | now time.Time, |
| 374 | actor ActorContext, |
| 375 | ) (ExpireTaskBlocksResult, error) { |
| 376 | if err := requireWriteAuthority(actor); err != nil { |
| 377 | return ExpireTaskBlocksResult{}, err |
| 378 | } |
| 379 | expireAt := now.UTC() |
| 380 | if expireAt.IsZero() { |
| 381 | expireAt = m.now().UTC() |
| 382 | } |
| 383 | result, err := m.store.ExpireTaskBlocks(ctx, ExpireTaskBlocksMutation{ |
| 384 | Now: expireAt, |
| 385 | ClearedBy: actor.Actor, |
| 386 | }) |
| 387 | if err != nil { |
| 388 | return ExpireTaskBlocksResult{}, err |
| 389 | } |
| 390 | blocksByTask := make(map[string][]TaskBlock) |
| 391 | taskIDs := make([]string, 0) |
| 392 | for _, block := range result.Blocks { |
| 393 | if _, ok := blocksByTask[block.TaskID]; !ok { |
| 394 | taskIDs = append(taskIDs, block.TaskID) |
| 395 | } |
| 396 | blocksByTask[block.TaskID] = append(blocksByTask[block.TaskID], block) |
| 397 | } |
| 398 | for _, taskID := range taskIDs { |
| 399 | blocks := blocksByTask[taskID] |
| 400 | reconciled, reconcileErr := m.reconcileTaskCascade(ctx, taskID) |
| 401 | if reconcileErr != nil { |
| 402 | return ExpireTaskBlocksResult{}, reconcileErr |
| 403 | } |
| 404 | for _, block := range blocks { |
| 405 | m.recordTaskBlockExpired(ctx, block, reconciled, actor) |
| 406 | m.dispatchTaskUnblocked(ctx, block, reconciled, actor) |
| 407 | } |
| 408 | m.autoEnqueueReadyTaskDetached(ctx, taskID, autoEnqueueTrigger{ |
| 409 | Kind: autoEnqueueTriggerTransientExpiry, |
| 410 | Ref: transientExpiryTriggerRef(blocks), |
| 411 | }, actor) |
| 412 | } |
| 413 | return result, nil |
| 414 | } |
| 415 | |
| 416 | func transientExpiryTriggerRef(blocks []TaskBlock) string { |
| 417 | if len(blocks) == 1 { |
nothing calls this directly
no test coverage detected