( ctx context.Context, taskID string, trigger autoEnqueueTrigger, pauseReader effectiveTaskPauseReader, actor ActorContext, )
| 409 | } |
| 410 | |
| 411 | func (m *Service) autoEnqueueReadyTask( |
| 412 | ctx context.Context, |
| 413 | taskID string, |
| 414 | trigger autoEnqueueTrigger, |
| 415 | pauseReader effectiveTaskPauseReader, |
| 416 | actor ActorContext, |
| 417 | ) { |
| 418 | taskRecord, err := m.store.GetTask(ctx, taskID) |
| 419 | if err != nil { |
| 420 | slog.Error("task: auto-enqueue load task failed", "task_id", taskID, "error", err) |
| 421 | return |
| 422 | } |
| 423 | if !taskRecord.AutoEnqueueOnReady || taskRecord.Status.Normalize() != TaskStatusReady { |
| 424 | return |
| 425 | } |
| 426 | if pauseReader != nil { |
| 427 | paused, _, pauseErr := pauseReader.IsTaskEffectivelyPaused(ctx, taskID) |
| 428 | if pauseErr != nil { |
| 429 | slog.Warn("task: auto-enqueue pause check failed", "task_id", taskID, "error", pauseErr) |
| 430 | return |
| 431 | } |
| 432 | if paused { |
| 433 | return |
| 434 | } |
| 435 | } |
| 436 | key := trigger.idempotencyKey(taskID) |
| 437 | run, enqErr := m.EnqueueRun(ctx, EnqueueRun{TaskID: taskID, IdempotencyKey: key}, actor) |
| 438 | switch { |
| 439 | case enqErr == nil: |
| 440 | m.recordAutoEnqueueTriggered(ctx, taskRecord, run, trigger, actor) |
| 441 | case errors.Is(enqErr, ErrInvalidStatusTransition) || errors.Is(enqErr, ErrConflict): |
| 442 | // Expected dedup: store rejects a second run (open run) or replayed idempotency key. |
| 443 | slog.Debug( |
| 444 | "task: auto-enqueue skipped; task already has an open run", |
| 445 | "task_id", taskID, |
| 446 | "trigger_kind", trigger.Kind, |
| 447 | "error", enqErr, |
| 448 | ) |
| 449 | default: |
| 450 | slog.Warn( |
| 451 | "task: auto-enqueue run failed", |
| 452 | "task_id", taskID, |
| 453 | "trigger_kind", trigger.Kind, |
| 454 | "error", enqErr, |
| 455 | ) |
| 456 | } |
| 457 | } |
| 458 | |
| 459 | func (m *Service) recordAutoEnqueueTriggered( |
| 460 | ctx context.Context, |
no test coverage detected