( _ context.Context, mutation RecoverRunMutation, )
| 1505 | } |
| 1506 | |
| 1507 | func (s *inMemoryManagerStore) RecoverTaskRun( |
| 1508 | _ context.Context, |
| 1509 | mutation RecoverRunMutation, |
| 1510 | ) (RetryRunResult, error) { |
| 1511 | source, ok := s.runs[strings.TrimSpace(mutation.SourceRunID)] |
| 1512 | if !ok { |
| 1513 | return RetryRunResult{}, ErrTaskRunNotFound |
| 1514 | } |
| 1515 | if source.Status.Normalize() != TaskRunStatusNeedsAttention { |
| 1516 | return RetryRunResult{}, ErrInvalidStatusTransition |
| 1517 | } |
| 1518 | for _, run := range s.runs { |
| 1519 | if strings.TrimSpace(run.PreviousRunID) == source.ID { |
| 1520 | return RetryRunResult{}, ErrInvalidStatusTransition |
| 1521 | } |
| 1522 | } |
| 1523 | taskRecord, ok := s.tasks[source.TaskID] |
| 1524 | if !ok { |
| 1525 | return RetryRunResult{}, ErrTaskNotFound |
| 1526 | } |
| 1527 | attempt := 1 |
| 1528 | for _, run := range s.runs { |
| 1529 | if run.TaskID == source.TaskID && run.Attempt >= attempt { |
| 1530 | attempt = run.Attempt + 1 |
| 1531 | } |
| 1532 | } |
| 1533 | if attempt > taskRecord.MaxAttempts { |
| 1534 | return RetryRunResult{}, ErrInvalidStatusTransition |
| 1535 | } |
| 1536 | queuedAt := mutation.QueuedAt.UTC() |
| 1537 | if queuedAt.IsZero() { |
| 1538 | queuedAt = time.Now().UTC() |
| 1539 | } |
| 1540 | failed := source |
| 1541 | failed.Status = TaskRunStatusFailed |
| 1542 | failed.FailureKind = FailureKindOperatorForced |
| 1543 | failed.Error = strings.TrimSpace(mutation.Reason) |
| 1544 | failed.EndedAt = queuedAt |
| 1545 | s.runs[failed.ID] = cloneTaskRun(failed) |
| 1546 | run := Run{ |
| 1547 | ID: strings.TrimSpace(mutation.NewRunID), |
| 1548 | TaskID: source.TaskID, |
| 1549 | Status: TaskRunStatusQueued, |
| 1550 | Attempt: attempt, |
| 1551 | PreviousRunID: source.ID, |
| 1552 | Origin: mutation.Origin, |
| 1553 | NetworkChannel: source.NetworkChannel, |
| 1554 | CoordinationChannelID: source.CoordinationChannelID, |
| 1555 | Metadata: cloneRawJSON(mutation.Metadata), |
| 1556 | QueuedAt: queuedAt, |
| 1557 | } |
| 1558 | s.runs[run.ID] = cloneTaskRun(run) |
| 1559 | return RetryRunResult{PreviousRun: cloneTaskRun(failed), Run: cloneTaskRun(run)}, nil |
| 1560 | } |
| 1561 | |
| 1562 | func (s *inMemoryManagerStore) MarkTaskRunNeedsAttention( |
| 1563 | _ context.Context, |
nothing calls this directly
no test coverage detected