-
-
Notifications
You must be signed in to change notification settings - Fork 635
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
New runs fundamentals page #1401
Changes from all commits
991d2d0
c5cebbb
d2268c5
325a817
c2fd916
c0c0eca
f18df88
6c0a949
e538ebb
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,187 @@ | ||
--- | ||
title: "Runs & attempts" | ||
description: "Understanding the lifecycle of task execution in Trigger.dev" | ||
--- | ||
|
||
In Trigger.dev, the concepts of runs and attempts are fundamental to understanding how tasks are executed and managed. This article explains these concepts in detail and provides insights into the various states a run can go through during its lifecycle. | ||
|
||
## What are runs? | ||
|
||
A run is created when you trigger a task (e.g. calling `yourTask.trigger({ foo: "bar" })`). It represents a single instance of a task being executed and contains the following key information: | ||
|
||
- A unique run ID | ||
- The current status of the run | ||
- The payload (input data) for the task | ||
- Lots of other metadata | ||
|
||
## The run lifecycle | ||
|
||
A run can go through **various** states during its lifecycle. The following diagram illustrates a typical state transition where a single run is triggered and completes successfully: | ||
|
||
![Run Lifecycle](/images/run-lifecycle.png) | ||
|
||
Runs can also find themselves in lots of other states depending on what's happening at any given time. The following sections describe all the possible states in more detail. | ||
|
||
### Initial States | ||
|
||
<Icon icon="rectangle-history" iconType="solid" color="#FBBF24" size={17} /> **Waiting for deploy**: If a task is triggered before it has been deployed, the run enters this state and waits for the task to be deployed. | ||
|
||
<Icon icon="clock" iconType="solid" color="#878C99" size={17} /> **Delayed**: When a run is triggered with a delay, it enters this state until the specified delay period has passed. | ||
|
||
<Icon icon="rectangle-history" iconType="solid" color="#878C99" size={17} /> **Queued**: The run is ready to be executed and is waiting in the queue. | ||
|
||
### Execution States | ||
|
||
<Icon icon="spinner-third" iconType="duotone" color="#3B82F6" size={17} /> **Executing**: The task is currently running. | ||
|
||
<Icon icon="arrows-rotate" iconType="solid" color="#3B82F6" size={17} /> **Reattempting**: The task has failed and is being retried. | ||
|
||
<Icon icon="snowflake" iconType="solid" color="#68BAF2" size={17} /> **Frozen**: Task has been frozen and is waiting to be resumed. | ||
|
||
### Final States | ||
|
||
<Icon icon="circle-check" iconType="solid" color="#28BF5C" size={17} /> **Completed**: The task has successfully finished execution. | ||
|
||
<Icon icon="ban" iconType="solid" color="#878C99" size={17} /> **Canceled**: The run was manually canceled by the user. | ||
|
||
<Icon icon="circle-xmark" iconType="solid" color="#E11D48" size={17} /> **Failed**: The task has failed to complete successfully. | ||
|
||
<Icon icon="alarm-exclamation" iconType="solid" color="#E11D48" size={17} /> **Timed out**: Task has failed because it exceeded its `maxDuration`. | ||
|
||
<Icon icon="fire" iconType="solid" color="#E11D48" size={17} /> **Crashed**: The worker process crashed during execution (likely due to an Out of Memory error). | ||
|
||
<Icon icon="bolt-slash" iconType="solid" color="#E11D48" size={17} /> **Interrupted**: In development mode, when the CLI is disconnected. | ||
|
||
<Icon icon="bug" iconType="solid" color="#E11D48" size={17} /> **System failure**: An unrecoverable system error has occurred. | ||
|
||
<Icon icon="trash-can" iconType="solid" color="#878C99" size={17} /> **Expired**: The run's Time-to-Live (TTL) has passed before it could start executing. | ||
|
||
## Attempts | ||
|
||
An attempt represents a single execution of a task within a run. A run can have one or more attempts, depending on the task's retry settings and whether it fails. Each attempt has: | ||
|
||
- A unique attempt ID | ||
- A status | ||
- An output (if successful) or an error (if failed) | ||
|
||
When a task fails, it will be retried according to its retry settings, creating new attempts until it either succeeds or reaches the retry limit. | ||
|
||
![Run with retries](/images/run-with-retries.png) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Codebase verification Run with retries image is missing. Please add the 🔗 Analysis chainVerify the existence of the Run with retries image Please ensure that the referenced image file exists and is correctly placed in the repository:
If the image is missing, please add it to maintain the documentation's completeness. 🏁 Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Verify the existence of the Run with retries image
if [ -f "public/images/run-with-retries.png" ]; then
echo "Run with retries image exists."
else
echo "Run with retries image is missing."
fi
Length of output: 126 |
||
|
||
## Run completion | ||
|
||
A run is considered finished when: | ||
|
||
1. The last attempt succeeds, or | ||
2. The task has reached its retry limit and all attempts have failed | ||
|
||
At this point, the run will have either an output (if successful) or an error (if failed). | ||
|
||
## Advanced run features | ||
|
||
### Idempotency Keys | ||
|
||
When triggering a task, you can provide an idempotency key to ensure the task is executed only once, even if triggered multiple times. This is useful for preventing duplicate executions in distributed systems. | ||
|
||
```javascript | ||
yourTask.trigger({ foo: "bar" }, { idempotencyKey: "unique-key" }); | ||
``` | ||
|
||
- If a run with the same idempotency key is already in progress, the new trigger will be ignored. | ||
- If the run has already finished, the previous output or error will be returned. | ||
|
||
### Canceling runs | ||
|
||
You can cancel an in-progress run using the API or the dashboard: | ||
|
||
```ts | ||
runs.cancel(runId); | ||
``` | ||
|
||
When a run is canceled: | ||
|
||
– The task execution is stopped | ||
|
||
– The run is marked as canceled | ||
|
||
– The task will not be retried | ||
|
||
– Any in-progress child runs are also canceled | ||
|
||
### Time-to-live (TTL) | ||
|
||
You can set a TTL when triggering a run: | ||
|
||
```ts | ||
yourTask.trigger({ foo: "bar" }, { ttl: "10m" }); | ||
``` | ||
|
||
If the run hasn't started within the specified TTL, it will automatically expire. This is useful for time-sensitive tasks. Note that dev runs automatically have a 10-minute TTL. | ||
|
||
![Run with TTL](/images/run-with-ttl.png) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Codebase verification Run with TTL image is missing The referenced image 🔗 Analysis chainVerify the existence of the Run with TTL image Please ensure that the referenced image file exists and is correctly placed in the repository:
If the image is missing, please add it to maintain the documentation's completeness. 🏁 Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Verify the existence of the Run with TTL image
if [ -f "public/images/run-with-ttl.png" ]; then
echo "Run with TTL image exists."
else
echo "Run with TTL image is missing."
fi
Length of output: 322 Script: #!/bin/bash
# Verify the existence of the Run with TTL image
if [ -f "public/images/run-with-ttl.png" ]; then
echo "Run with TTL image exists."
else
echo "Run with TTL image is missing."
fi
Length of output: 114 |
||
|
||
### Delayed runs | ||
|
||
You can schedule a run to start after a specified delay: | ||
|
||
```ts | ||
yourTask.trigger({ foo: "bar" }, { delay: "1h" }); | ||
``` | ||
|
||
This is useful for tasks that need to be executed at a specific time in the future. | ||
|
||
![Run with delay](/images/run-with-delay.png) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Codebase verification Run with delay image is missing in the repository
Please add the 🔗 Analysis chainVerify the existence of the Run with delay image Please ensure that the referenced image file exists and is correctly placed in the repository:
If the image is missing, please add it to maintain the documentation's completeness. 🏁 Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Verify the existence of the Run with delay image
if [ -f "public/images/run-with-delay.png" ]; then
echo "Run with delay image exists."
else
echo "Run with delay image is missing."
fi
Length of output: 322 Script: #!/bin/bash
# Verify the existence of the Run with delay image
if [ -f "public/images/run-with-delay.png" ]; then
echo "Run with delay image exists."
else
echo "Run with delay image is missing."
fi
Length of output: 120 |
||
|
||
### Replaying runs | ||
|
||
You can create a new run with the same payload as a previous run: | ||
|
||
```ts | ||
runs.replay(runId); | ||
``` | ||
|
||
This is useful for re-running a task with the same input, especially for debugging or recovering from failures. The new run will use the latest version of the task. | ||
|
||
You can also replay runs from the dashboard using the same or different payload. Learn how to do this [here](/replaying). | ||
|
||
### Waiting for runs | ||
|
||
#### triggerAndWait() | ||
|
||
The `triggerAndWait()` function triggers a task and then lets you wait for the result before continuing. [Learn more about triggerAndWait()](/triggering#yourtask-triggerandwait). | ||
|
||
![Run with triggerAndWait](/images/run-with-triggerAndWait().png) | ||
|
||
#### batchTriggerAndWait() | ||
|
||
Similar to `triggerAndWait()`, the `batchTriggerAndWait()` function lets you batch trigger a task and wait for all the results [Learn more about batchTriggerAndWait()](/triggering#yourtask-batchtriggerandwait). | ||
|
||
![Run with batchTriggerAndWait](/images/run-with-batchTriggerAndWait().png) | ||
|
||
### Runs API | ||
|
||
The runs API provides methods to interact with and manage runs: | ||
|
||
```ts | ||
// List all runs | ||
runs.list(); | ||
|
||
// Get a specific run by ID | ||
runs.retrieve(runId); | ||
|
||
// Replay a run | ||
runs.replay(runId); | ||
|
||
// Reschedule a run | ||
runs.reschedule(runId, delay); | ||
|
||
// Cancel a run | ||
runs.cancel(runId); | ||
``` | ||
|
||
These methods allow you to access detailed information about runs and their attempts, including payloads, outputs, parent runs, and child runs. | ||
|
||
### Triggering runs for undeployed tasks | ||
|
||
It's possible to trigger a run for a task that hasn't been deployed yet. The run will enter the "Waiting for deploy" state until the task is deployed. Once deployed, the run will be queued and executed normally. | ||
This feature is particularly useful in CI/CD pipelines where you want to trigger tasks before the deployment is complete. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Codebase verification
Run Lifecycle image is missing
Please add the
run-lifecycle.png
image to the repository to ensure the documentation is complete.🔗 Analysis chain
Verify the existence of the Run Lifecycle image
Please ensure that the referenced image file exists and is correctly placed in the repository:
If the image is missing, please add it to maintain the documentation's completeness.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
Length of output: 126
Script:
Length of output: 110