ReLab

Break it. Watch it recover.

← all runs

Run

Status
FAILED
Workflow
data-pipeline v1
Run id
29780383-a221-4743-8fd1-72660de1e6d5
Seed
7
Scenario
upstream-down-throughout
Duration
2.97s

3 of 4 tasks did not succeed

This run was disrupted and did not finish

3 tasks exhausted its attempts and was dead-lettered. All of it is in the 28 events below.

What happened

The milestones of this run, in the order they were recorded. Each one is a real event; the full sequence is in the timeline below.

  1. Run started#6 23:31:04.036
    RUN_STARTED

    A worker picked up the first task in the run.

  2. Failure injected on purpose validate#11 23:31:04.049
    FAULT_INJECTED

    ReLab degraded the real system here. This is the break, and everything after it is the recovery.

  3. Retry scheduled validate#13 23:31:04.050
    TASK_RETRY_SCHEDULED

    The task will be offered again after a backoff delay.

  4. Task running validate#16 23:31:04.893
    TASK_STARTED

    The handler began executing. Each attempt writes one of these.

  5. Task gave up validate#25 23:31:06.990
    TASK_DEAD_LETTERED

    The task exhausted its attempts and will not be tried again.

  6. Workflow failed#28 23:31:06.990
    RUN_FAILED

    A task ran out of attempts and the run could not continue.

What the journal proves

4
Attempts
1
Workers involved
3
Faults injected
0
Leases expired
0
Tasks requeued
2
Retries scheduled
0
Workers lost
0
Effects suppressed
3
Dead-lettered
2.94s
Recovery

Every number above is a count of events in this run’s journal. Recovery is measured from the first fault, lease expiry, task failure or lost worker to the run completing, the same interval relab test asserts on.

Tasks

Each task in the run, with the attempt it reached and the worker that last held it.
StatusTaskAttemptWorkerError
DEADanalyze0/3··
SUCCEEDEDimport1/3db3c6da3·
DEADreport0/3··
DEADvalidate3/3·injected http-error fault: upstream returned 503

Timeline

The run’s complete recorded history, in sequence order. This is the same journal relab replay reduces. Filtering hides rows from this view; it never changes the sequence numbers, so a gap in them is still a gap.

21 of 28 recorded events, oldest first.
SeqTimeWhat happenedTaskWorkerTechnical detail
223:31:04.020Task ready to runTASK_SCHEDULEDimport·
attempt=0

The task's dependencies are satisfied, so it entered the queue.

Event
TASK_SCHEDULED
Sequence
2
Task
import
Worker
·
Occurred at
2026-09-02T23:31:04.0205Z
{
  "v": 1,
  "attempt": 0,
  "scheduled_at": "2026-09-02T23:31:04.020500779Z"
}
423:31:04.028Task claimed by a workerTASK_LEASEDimportdb3c6da3
attempt=1

One worker holds the task for a bounded time and renews that hold while it works. The hold is on this attempt: if it expires while that worker is still running, a second worker may take the task under a new attempt number.

Event
TASK_LEASED
Sequence
4
Task
import
Worker
db3c6da3-e415-4bab-9cca-4f681543a791
Occurred at
2026-09-02T23:31:04.028667Z
{
  "v": 1,
  "attempt": 1,
  "lease_expires_at": "2026-09-02T23:31:34.028667542Z"
}
523:31:04.036Task runningTASK_STARTEDimportdb3c6da3
attempt=1

The handler began executing. Each attempt writes one of these.

Event
TASK_STARTED
Sequence
5
Task
import
Worker
db3c6da3-e415-4bab-9cca-4f681543a791
Occurred at
2026-09-02T23:31:04.036525Z
{
  "v": 1,
  "attempt": 1,
  "handler": "import_csv"
}
723:31:04.039Task finishedTASK_SUCCEEDEDimportdb3c6da3
attempt=1 duration_ms=0

The handler returned without an error and the result was recorded.

Event
TASK_SUCCEEDED
Sequence
7
Task
import
Worker
db3c6da3-e415-4bab-9cca-4f681543a791
Occurred at
2026-09-02T23:31:04.039478Z
{
  "v": 1,
  "output": {
    "rows": 1000
  },
  "attempt": 1,
  "artifacts": [
    {
      "name": "imported.csv",
      "size": 9,
      "sha256": "6eb31300aed462386f9f52f25d0155b3ca1a9ebce4c811950777282d69a81c64",
      "content_type": "text/csv"
    }
  ],
  "duration_ms": 0
}
823:31:04.039Task ready to runTASK_SCHEDULEDvalidate·
attempt=0

The task's dependencies are satisfied, so it entered the queue.

Event
TASK_SCHEDULED
Sequence
8
Task
validate
Worker
·
Occurred at
2026-09-02T23:31:04.039478Z
{
  "v": 1,
  "attempt": 0,
  "depends_on": [
    "import"
  ],
  "scheduled_at": "2026-09-02T23:31:04.039478796Z"
}
923:31:04.044Task claimed by a workerTASK_LEASEDvalidatedb3c6da3
attempt=1

One worker holds the task for a bounded time and renews that hold while it works. The hold is on this attempt: if it expires while that worker is still running, a second worker may take the task under a new attempt number.

Event
TASK_LEASED
Sequence
9
Task
validate
Worker
db3c6da3-e415-4bab-9cca-4f681543a791
Occurred at
2026-09-02T23:31:04.044949Z
{
  "v": 1,
  "attempt": 1,
  "lease_expires_at": "2026-09-02T23:31:34.044949701Z"
}
1023:31:04.047Task runningTASK_STARTEDvalidatedb3c6da3
attempt=1

The handler began executing. Each attempt writes one of these.

Event
TASK_STARTED
Sequence
10
Task
validate
Worker
db3c6da3-e415-4bab-9cca-4f681543a791
Occurred at
2026-09-02T23:31:04.047864Z
{
  "v": 1,
  "attempt": 1,
  "handler": "validate_rows"
}
1223:31:04.050Task failedTASK_FAILEDvalidatedb3c6da3
attempt=1 error=injected http-error fault: upstream returned 503 duration_ms=0

The attempt returned an error. Whether it is retried depends on attempts remaining.

Event
TASK_FAILED
Sequence
12
Task
validate
Worker
db3c6da3-e415-4bab-9cca-4f681543a791
Occurred at
2026-09-02T23:31:04.050011Z
{
  "v": 1,
  "error": "injected http-error fault: upstream returned 503",
  "attempt": 1,
  "retryable": true,
  "duration_ms": 0
}
1323:31:04.050Retry scheduledTASK_RETRY_SCHEDULEDvalidate·
attempt=1 next_attempt=2 delay_ms=816

The task will be offered again after a backoff delay.

Event
TASK_RETRY_SCHEDULED
Sequence
13
Task
validate
Worker
·
Occurred at
2026-09-02T23:31:04.050011Z
{
  "v": 1,
  "run_at": "2026-09-02T23:31:04.866937481Z",
  "attempt": 1,
  "delay_ms": 816,
  "next_attempt": 2
}
1423:31:04.888Task ready to runTASK_SCHEDULEDvalidate·
attempt=1

The task's dependencies are satisfied, so it entered the queue.

Event
TASK_SCHEDULED
Sequence
14
Task
validate
Worker
·
Occurred at
2026-09-02T23:31:04.888795Z
{
  "v": 1,
  "attempt": 1,
  "scheduled_at": "2026-09-02T23:31:04.888795832Z"
}
1523:31:04.890Task claimed by a workerTASK_LEASEDvalidatedb3c6da3
attempt=2

One worker holds the task for a bounded time and renews that hold while it works. The hold is on this attempt: if it expires while that worker is still running, a second worker may take the task under a new attempt number.

Event
TASK_LEASED
Sequence
15
Task
validate
Worker
db3c6da3-e415-4bab-9cca-4f681543a791
Occurred at
2026-09-02T23:31:04.890548Z
{
  "v": 1,
  "attempt": 2,
  "lease_expires_at": "2026-09-02T23:31:34.890548215Z"
}
1623:31:04.893Task runningTASK_STARTEDvalidatedb3c6da3
attempt=2

The handler began executing. Each attempt writes one of these.

Event
TASK_STARTED
Sequence
16
Task
validate
Worker
db3c6da3-e415-4bab-9cca-4f681543a791
Occurred at
2026-09-02T23:31:04.893384Z
{
  "v": 1,
  "attempt": 2,
  "handler": "validate_rows"
}
1823:31:04.896Task failedTASK_FAILEDvalidatedb3c6da3
attempt=2 error=injected http-error fault: upstream returned 503 duration_ms=0

The attempt returned an error. Whether it is retried depends on attempts remaining.

Event
TASK_FAILED
Sequence
18
Task
validate
Worker
db3c6da3-e415-4bab-9cca-4f681543a791
Occurred at
2026-09-02T23:31:04.896821Z
{
  "v": 1,
  "error": "injected http-error fault: upstream returned 503",
  "attempt": 2,
  "retryable": true,
  "duration_ms": 0
}
1923:31:04.896Retry scheduledTASK_RETRY_SCHEDULEDvalidate·
attempt=2 next_attempt=3 delay_ms=2070

The task will be offered again after a backoff delay.

Event
TASK_RETRY_SCHEDULED
Sequence
19
Task
validate
Worker
·
Occurred at
2026-09-02T23:31:04.896821Z
{
  "v": 1,
  "run_at": "2026-09-02T23:31:06.967797438Z",
  "attempt": 2,
  "delay_ms": 2070,
  "next_attempt": 3
}
2023:31:06.981Task ready to runTASK_SCHEDULEDvalidate·
attempt=2

The task's dependencies are satisfied, so it entered the queue.

Event
TASK_SCHEDULED
Sequence
20
Task
validate
Worker
·
Occurred at
2026-09-02T23:31:06.981373Z
{
  "v": 1,
  "attempt": 2,
  "scheduled_at": "2026-09-02T23:31:06.981373147Z"
}
2123:31:06.983Task claimed by a workerTASK_LEASEDvalidatedb3c6da3
attempt=3

One worker holds the task for a bounded time and renews that hold while it works. The hold is on this attempt: if it expires while that worker is still running, a second worker may take the task under a new attempt number.

Event
TASK_LEASED
Sequence
21
Task
validate
Worker
db3c6da3-e415-4bab-9cca-4f681543a791
Occurred at
2026-09-02T23:31:06.983002Z
{
  "v": 1,
  "attempt": 3,
  "lease_expires_at": "2026-09-02T23:31:36.98300296Z"
}
2223:31:06.987Task runningTASK_STARTEDvalidatedb3c6da3
attempt=3

The handler began executing. Each attempt writes one of these.

Event
TASK_STARTED
Sequence
22
Task
validate
Worker
db3c6da3-e415-4bab-9cca-4f681543a791
Occurred at
2026-09-02T23:31:06.987892Z
{
  "v": 1,
  "attempt": 3,
  "handler": "validate_rows"
}
2423:31:06.990Task failedTASK_FAILEDvalidatedb3c6da3
attempt=3 error=injected http-error fault: upstream returned 503 duration_ms=0

The attempt returned an error. Whether it is retried depends on attempts remaining.

Event
TASK_FAILED
Sequence
24
Task
validate
Worker
db3c6da3-e415-4bab-9cca-4f681543a791
Occurred at
2026-09-02T23:31:06.990518Z
{
  "v": 1,
  "error": "injected http-error fault: upstream returned 503",
  "attempt": 3,
  "retryable": false,
  "duration_ms": 0
}
2523:31:06.990Task gave upTASK_DEAD_LETTEREDvalidate·
reason=attempts exhausted: injected http-error fault: upstream r…

The task exhausted its attempts and will not be tried again.

Event
TASK_DEAD_LETTERED
Sequence
25
Task
validate
Worker
·
Occurred at
2026-09-02T23:31:06.990518Z
{
  "v": 1,
  "reason": "attempts exhausted: injected http-error fault: upstream returned 503",
  "attempts": 3
}
2623:31:06.990Task gave upTASK_DEAD_LETTEREDanalyze·
reason=upstream task validate did not succeed:

The task exhausted its attempts and will not be tried again.

Event
TASK_DEAD_LETTERED
Sequence
26
Task
analyze
Worker
·
Occurred at
2026-09-02T23:31:06.990518Z
{
  "v": 1,
  "reason": "upstream task validate did not succeed: ",
  "attempts": 0
}
2723:31:06.990Task gave upTASK_DEAD_LETTEREDreport·
reason=upstream task validate did not succeed:

The task exhausted its attempts and will not be tried again.

Event
TASK_DEAD_LETTERED
Sequence
27
Task
report
Worker
·
Occurred at
2026-09-02T23:31:06.990518Z
{
  "v": 1,
  "reason": "upstream task validate did not succeed: ",
  "attempts": 0
}
RECORDINGfive real runs exported from real PostgreSQL by scripts/record-demo.sh, crashes delivered by SIGKILLrelab 241c136-dirty, recorded