feat: recover workflow waits within original deadlines
This commit is contained in:
@@ -155,6 +155,17 @@ func (s *WorkflowRecoveryStore) ReviewTask(ctx context.Context, t auth.Token, id
|
||||
}
|
||||
|
||||
func workflowRecoveryStep(g *workflowGraph, in recovery.StepDecision) (*workflowStep, error) {
|
||||
row, err := workflowRecoveryTarget(g, in)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if row.view.State != weave.StepNeedsReview && row.view.State != weave.StepFailed && row.view.State != weave.StepCancelled {
|
||||
return nil, fault.Conflict
|
||||
}
|
||||
return row, nil
|
||||
}
|
||||
|
||||
func workflowRecoveryTarget(g *workflowGraph, in recovery.StepDecision) (*workflowStep, error) {
|
||||
row := g.steps[in.StepKey]
|
||||
if row == nil || in.StepKey == workflowRootKey {
|
||||
return nil, fault.NotFound
|
||||
@@ -162,9 +173,6 @@ func workflowRecoveryStep(g *workflowGraph, in recovery.StepDecision) (*workflow
|
||||
if row.view.ActivationID == nil || *row.view.ActivationID != in.ActivationID || row.view.Revision != in.ExpectedStepRevision {
|
||||
return nil, fault.Conflict
|
||||
}
|
||||
if row.view.State != weave.StepNeedsReview && row.view.State != weave.StepFailed && row.view.State != weave.StepCancelled {
|
||||
return nil, fault.Conflict
|
||||
}
|
||||
return row, nil
|
||||
}
|
||||
|
||||
@@ -217,11 +225,11 @@ func (s *WorkflowRecoveryStore) ResolveStep(ctx context.Context, t auth.Token, i
|
||||
}
|
||||
typ = node.Poll.Task.ResultType
|
||||
case node.Timer != nil:
|
||||
var activated time.Time
|
||||
if err := tx.QueryRowContext(ctx, `SELECT created_at FROM weave_activations WHERE namespace_id=? AND id=?`, t.NamespaceID, row.view.ActivationID).Scan(&activated); err != nil {
|
||||
origin, err := workflowActivationOrigin(ctx, tx, g, row)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if now.Before(activated.Add(time.Duration(node.Timer.DelayMS) * time.Millisecond)) {
|
||||
if now.Before(origin.started.Add(time.Duration(node.Timer.DelayMS) * time.Millisecond)) {
|
||||
return nil, fault.Conflict
|
||||
}
|
||||
typ = definition.Type{Kind: "NULL"}
|
||||
|
||||
Reference in New Issue
Block a user