Compare retries already spent against a fixed budget and choose a retry, hold, or abort action.

remaining budget The remaining budget is derived once so each action variant has a single visible driver.
remediation step The action moves from retry to hold to abort as the remaining budget is consumed.

Retry Budget Remediation Report

retriesUsed
retry_budget_remediation_report.c
Replay: real traced execution (multi-file project)
#include <stdio.h>

int main(void) {
    int retriesUsed = 1;
    int retryBudget = 4;
    int remaining = retryBudget - retriesUsed;
    const char *action = "retry";

    if (remaining <= 1) {
        action = "hold";
    }

    if (remaining <= 0) {
        action = "abort";
    }

    printf("used=%d\n", retriesUsed);
    printf("remaining=%d\n", remaining);
    printf("action=%s\n", action);
    return 0;
}
#include <stdio.h>

int main(void) {
    int retriesUsed = 3;
    int retryBudget = 4;
    int remaining = retryBudget - retriesUsed;
    const char *action = "retry";

    if (remaining <= 1) {
        action = "hold";
    }

    if (remaining <= 0) {
        action = "abort";
    }

    printf("used=%d\n", retriesUsed);
    printf("remaining=%d\n", remaining);
    printf("action=%s\n", action);
    return 0;
}
#include <stdio.h>

int main(void) {
    int retriesUsed = 5;
    int retryBudget = 4;
    int remaining = retryBudget - retriesUsed;
    const char *action = "retry";

    if (remaining <= 1) {
        action = "hold";
    }

    if (remaining <= 0) {
        action = "abort";
    }

    printf("used=%d\n", retriesUsed);
    printf("remaining=%d\n", remaining);
    printf("action=%s\n", action);
    return 0;
}
  1. retriesUsed ← 1, retryBudget ← 4, remaining ← 3, action ← retry

    3int main(void) {4    int retriesUsed→ 1 = 1; //@retriesUsed=3, 55    int retryBudget→ 4 = 4;6    int remaining→ 3 = retryBudget4 - retriesUsed1;7    const char *action→ retry = "retry";89    if (remaining <= 1) {10        action = "hold";11    }1213    if (remaining <= 0) {14        action = "abort";15    }1617    printf("used=%d\n", retriesUsed1);18    printf("remaining=%d\n", remaining3);19    printf("action=%s\n", actionretry);20    return 0;21}
    outputused=1
    remaining=3
    action=retry
  1. retriesUsed ← 3, retryBudget ← 4, remaining ← 1, action ← retry

    3int main(void) {4    int retriesUsed→ 3 = 3;5    int retryBudget→ 4 = 4;6    int remaining→ 1 = retryBudget4 - retriesUsed3;7    const char *action→ retry = "retry";
  2. action ← hold

    9if (remaining1 <= 1) {10    action→ hold = "hold";11}
  3. printf("used=%d ", retriesUsed);

    17    printf("used=%d\n", retriesUsed3);18    printf("remaining=%d\n", remaining1);19    printf("action=%s\n", actionhold);20    return 0;21}
    outputused=3
    remaining=1
    action=hold
  1. retriesUsed ← 5, retryBudget ← 4, remaining ← -1, action ← retry

    3int main(void) {4    int retriesUsed→ 5 = 5;5    int retryBudget→ 4 = 4;6    int remaining→ -1 = retryBudget4 - retriesUsed5;7    const char *action→ retry = "retry";
  2. action ← hold

    9if (remaining-1 <= 1) {10    action→ hold = "hold";11}
  3. action ← abort

    13if (remaining-1 <= 0) {14    action→ abort = "abort";15}
  4. printf("used=%d ", retriesUsed);

    17    printf("used=%d\n", retriesUsed5);18    printf("remaining=%d\n", remaining-1);19    printf("action=%s\n", actionabort);20    return 0;21}
    outputused=5
    remaining=-1
    action=abort