Workflow Automation
Pipeline Status
Mark Retries
Automation needs a compact status summary so a failed step can be retried deliberately.
Program
Play the script to choose whether a pipeline step needs a retry.
pipeline_status.R
Replay: real traced execution (multi-file project)
failed_step <- 0
steps <- c("extract", "transform", "load")
status <- rep("ok", length(steps))
if (failed_step > 0) {
status[failed_step] <- "retry"
}
ready <- all(status == "ok")
label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")
cat(label, "\n", sep = "")
failed_step <- 2
steps <- c("extract", "transform", "load")
status <- rep("ok", length(steps))
if (failed_step > 0) {
status[failed_step] <- "retry"
}
ready <- all(status == "ok")
label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")
cat(label, "\n", sep = "")
failed_step <- 3
steps <- c("extract", "transform", "load")
status <- rep("ok", length(steps))
if (failed_step > 0) {
status[failed_step] <- "retry"
}
ready <- all(status == "ok")
label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")
cat(label, "\n", sep = "")
failed_step ← 0
1failed_step <- 02steps <- c("extract", "transform", "load")values this step0failed_stepsteps ← extract, transform, load
1failed_step <- 02steps <- c("extract", "transform", "load")3status <- rep("ok", length(steps))values this stepextract, transform, loadstepsstatus ← ok, ok, ok
2steps <- c("extract", "transform", "load")3status <- rep("ok", length(steps))4if (failed_step > 0) {values this stepok, ok, okstatus3 stepsstepsbranch ← skip retry
3status <- rep("ok", length(steps))4if (failed_step > 0) {5 status[failed_step] <- "retry"values this stepskip retrybranch0failed_stepready ← TRUE
6}7ready <- all(status == "ok")8label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")values this stepTRUEreadyok, ok, okstatuslabel ← ready:ok/ok/ok
7ready <- all(status == "ok")8label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")9cat(label, "\n", sep = "")values this stepready:ok/ok/oklabelTRUEreadyok, ok, okstatuscat(label, " ", sep = "")
8label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")9cat(label, "\n", sep = "")outputready:ok/ok/okvalues this stepready:ok/ok/oklabel
failed_step ← 2
1failed_step <- 22steps <- c("extract", "transform", "load")values this step2failed_stepsteps ← extract, transform, load
1failed_step <- 22steps <- c("extract", "transform", "load")3status <- rep("ok", length(steps))values this stepextract, transform, loadstepsstatus ← ok, ok, ok
2steps <- c("extract", "transform", "load")3status <- rep("ok", length(steps))4if (failed_step > 0) {values this stepok, ok, okstatus3 stepsstepsbranch ← retry step 2
3status <- rep("ok", length(steps))4if (failed_step > 0) {5 status[failed_step] <- "retry"values this stepretry step 2branch2failed_stepstatus ← ok, retry, ok
4if (failed_step > 0) {5 status[failed_step] <- "retry"6}values this stepok, retry, okstatus2failed_stepready ← FALSE
6}7ready <- all(status == "ok")8label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")values this stepFALSEreadyok, retry, okstatuslabel ← blocked:ok/retry/ok
7ready <- all(status == "ok")8label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")9cat(label, "\n", sep = "")values this stepblocked:ok/retry/oklabelFALSEreadyok, retry, okstatuscat(label, " ", sep = "")
8label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")9cat(label, "\n", sep = "")outputblocked:ok/retry/okvalues this stepblocked:ok/retry/oklabel
failed_step ← 3
1failed_step <- 32steps <- c("extract", "transform", "load")values this step3failed_stepsteps ← extract, transform, load
1failed_step <- 32steps <- c("extract", "transform", "load")3status <- rep("ok", length(steps))values this stepextract, transform, loadstepsstatus ← ok, ok, ok
2steps <- c("extract", "transform", "load")3status <- rep("ok", length(steps))4if (failed_step > 0) {values this stepok, ok, okstatus3 stepsstepsbranch ← retry step 3
3status <- rep("ok", length(steps))4if (failed_step > 0) {5 status[failed_step] <- "retry"values this stepretry step 3branch3failed_stepstatus ← ok, ok, retry
4if (failed_step > 0) {5 status[failed_step] <- "retry"6}values this stepok, ok, retrystatus3failed_stepready ← FALSE
6}7ready <- all(status == "ok")8label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")values this stepFALSEreadyok, ok, retrystatuslabel ← blocked:ok/ok/retry
7ready <- all(status == "ok")8label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")9cat(label, "\n", sep = "")values this stepblocked:ok/ok/retrylabelFALSEreadyok, ok, retrystatuscat(label, " ", sep = "")
8label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")9cat(label, "\n", sep = "")outputblocked:ok/ok/retryvalues this stepblocked:ok/ok/retrylabel
status vector
A status vector records one state per workflow step.
retry flag
Changing one position to `retry` marks the step that needs attention.
ready check
`all(status == "ok")` turns step states into one pipeline decision.