Skip to content

Commit 0f7a889

Browse files
committed
consolidate task statuses and utils
1 parent 9835f4e commit 0f7a889

File tree

8 files changed

+94
-74
lines changed

8 files changed

+94
-74
lines changed

apps/webapp/app/presenters/v3/RunListPresenter.server.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import { Direction } from "~/components/runs/RunStatuses";
44
import { FINISHED_STATUSES } from "~/components/runs/v3/TaskRunStatus";
55
import { sqlDatabaseSchema } from "~/db.server";
66
import { displayableEnvironment } from "~/models/runtimeEnvironment.server";
7-
import { CANCELLABLE_STATUSES } from "~/v3/services/cancelTaskRun.server";
87
import { BasePresenter } from "./basePresenter.server";
8+
import { isCancellableRunStatus } from "~/v3/taskStatus";
99

1010
export type RunListOptions = {
1111
userId?: string;
@@ -291,7 +291,7 @@ export class RunListPresenter extends BasePresenter {
291291
taskIdentifier: run.taskIdentifier,
292292
spanId: run.spanId,
293293
isReplayable: true,
294-
isCancellable: CANCELLABLE_STATUSES.includes(run.status),
294+
isCancellable: isCancellableRunStatus(run.status),
295295
environment: displayableEnvironment(environment, userId),
296296
idempotencyKey: run.idempotencyKey ? run.idempotencyKey : undefined,
297297
};

apps/webapp/app/v3/marqs/sharedQueueConsumer.server.ts

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import {
1717
BackgroundWorkerTask,
1818
RuntimeEnvironment,
1919
TaskRun,
20-
TaskRunAttemptStatus,
2120
TaskRunStatus,
2221
} from "@trigger.dev/database";
2322
import { z } from "zod";
@@ -43,6 +42,7 @@ import { generateJWTTokenForEnvironment } from "~/services/apiAuth.server";
4342
import { EnvironmentVariable } from "../environmentVariables/repository";
4443
import { machinePresetFromConfig } from "../machinePresets.server";
4544
import { env } from "~/env.server";
45+
import { isFinalAttemptStatus, isFinalRunStatus } from "../taskStatus";
4646

4747
const WithTraceContext = z.object({
4848
traceparent: z.string().optional(),
@@ -962,19 +962,7 @@ class SharedQueueTasks {
962962
}
963963

964964
if (setToExecuting) {
965-
const FINAL_RUN_STATUSES: TaskRunStatus[] = [
966-
"CANCELED",
967-
"COMPLETED_SUCCESSFULLY",
968-
"COMPLETED_WITH_ERRORS",
969-
"INTERRUPTED",
970-
"SYSTEM_FAILURE",
971-
];
972-
const FINAL_ATTEMPT_STATUSES: TaskRunAttemptStatus[] = ["CANCELED", "COMPLETED", "FAILED"];
973-
974-
if (
975-
FINAL_ATTEMPT_STATUSES.includes(attempt.status) ||
976-
FINAL_RUN_STATUSES.includes(attempt.taskRun.status)
977-
) {
965+
if (isFinalAttemptStatus(attempt.status) || isFinalRunStatus(attempt.taskRun.status)) {
978966
logger.error("Status already in final state", {
979967
attempt: {
980968
id: attempt.id,

apps/webapp/app/v3/services/cancelAttempt.server.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { logger } from "~/services/logger.server";
66

77
import { PrismaClientOrTransaction, prisma } from "~/db.server";
88
import { ResumeTaskRunDependenciesService } from "./resumeTaskRunDependencies.server";
9-
import { CANCELLABLE_STATUSES } from "./cancelTaskRun.server";
9+
import { isCancellableRunStatus } from "../taskStatus";
1010

1111
export class CancelAttemptService extends BaseService {
1212
public async call(
@@ -55,7 +55,7 @@ export class CancelAttemptService extends BaseService {
5555
taskRun: {
5656
update: {
5757
data: {
58-
status: CANCELLABLE_STATUSES.includes(taskRunAttempt.taskRun.status)
58+
status: isCancellableRunStatus(taskRunAttempt.taskRun.status)
5959
? "INTERRUPTED"
6060
: undefined,
6161
},

apps/webapp/app/v3/services/cancelTaskRun.server.ts

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Prisma, TaskRun, TaskRunAttemptStatus, TaskRunStatus } from "@trigger.dev/database";
1+
import { Prisma, TaskRun } from "@trigger.dev/database";
22
import assertNever from "assert-never";
33
import { logger } from "~/services/logger.server";
44
import { marqs } from "~/v3/marqs/index.server";
@@ -7,22 +7,7 @@ import { socketIo } from "../handleSocketIo.server";
77
import { devPubSub } from "../marqs/devPubSub.server";
88
import { BaseService } from "./baseService.server";
99
import { CancelAttemptService } from "./cancelAttempt.server";
10-
11-
export const CANCELLABLE_STATUSES: Array<TaskRunStatus> = [
12-
"PENDING",
13-
"WAITING_FOR_DEPLOY",
14-
"EXECUTING",
15-
"PAUSED",
16-
"WAITING_TO_RESUME",
17-
"PAUSED",
18-
"RETRYING_AFTER_FAILURE",
19-
];
20-
21-
const CANCELLABLE_ATTEMPT_STATUSES: Array<TaskRunAttemptStatus> = [
22-
"EXECUTING",
23-
"PAUSED",
24-
"PENDING",
25-
];
10+
import { CANCELLABLE_ATTEMPT_STATUSES, isCancellableRunStatus } from "../taskStatus";
2611

2712
type ExtendedTaskRun = Prisma.TaskRunGetPayload<{
2813
include: {
@@ -53,7 +38,11 @@ export class CancelTaskRunService extends BaseService {
5338
};
5439

5540
// Make sure the task run is in a cancellable state
56-
if (!CANCELLABLE_STATUSES.includes(taskRun.status)) {
41+
if (!isCancellableRunStatus(taskRun.status)) {
42+
logger.error("Task run is not in a cancellable state", {
43+
runId: taskRun.id,
44+
status: taskRun.status,
45+
});
5746
return;
5847
}
5948

apps/webapp/app/v3/services/crashTaskRun.server.ts

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,11 @@
1-
import {
2-
TaskRun,
3-
TaskRunAttempt,
4-
TaskRunAttemptStatus,
5-
TaskRunStatus,
6-
} from "@trigger.dev/database";
1+
import { TaskRun, TaskRunAttempt } from "@trigger.dev/database";
72
import { eventRepository } from "../eventRepository.server";
83
import { marqs } from "~/v3/marqs/index.server";
94
import { BaseService } from "./baseService.server";
105
import { logger } from "~/services/logger.server";
116
import { AuthenticatedEnvironment } from "~/services/apiAuth.server";
127
import { ResumeTaskRunDependenciesService } from "./resumeTaskRunDependencies.server";
13-
14-
export const CRASHABLE_RUN_STATUSES: Array<TaskRunStatus> = [
15-
"PENDING",
16-
"WAITING_FOR_DEPLOY",
17-
"EXECUTING",
18-
"PAUSED",
19-
"WAITING_TO_RESUME",
20-
"PAUSED",
21-
"RETRYING_AFTER_FAILURE",
22-
];
23-
24-
const CRASHABLE_ATTEMPT_STATUSES: Array<TaskRunAttemptStatus> = ["EXECUTING", "PAUSED", "PENDING"];
8+
import { CRASHABLE_ATTEMPT_STATUSES, isCrashableRunStatus } from "../taskStatus";
259

2610
export type CrashTaskRunServiceOptions = {
2711
reason?: string;
@@ -52,7 +36,8 @@ export class CrashTaskRunService extends BaseService {
5236
}
5337

5438
// Make sure the task run is in a crashable state
55-
if (!CRASHABLE_RUN_STATUSES.includes(taskRun.status)) {
39+
if (!isCrashableRunStatus(taskRun.status)) {
40+
logger.error("Task run is not in a crashable state", { runId, status: taskRun.status });
5641
return;
5742
}
5843

apps/webapp/app/v3/services/createCheckpoint.server.ts

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,13 @@
11
import { CoordinatorToPlatformMessages } from "@trigger.dev/core/v3";
22
import type { InferSocketMessageSchema } from "@trigger.dev/core/v3/zodSocket";
3-
import type {
4-
CheckpointRestoreEvent,
5-
TaskRunAttemptStatus,
6-
TaskRunStatus,
7-
} from "@trigger.dev/database";
3+
import type { CheckpointRestoreEvent } from "@trigger.dev/database";
84
import { logger } from "~/services/logger.server";
95
import { generateFriendlyId } from "../friendlyIdentifiers";
106
import { marqs } from "~/v3/marqs/index.server";
117
import { CreateCheckpointRestoreEventService } from "./createCheckpointRestoreEvent.server";
128
import { BaseService } from "./baseService.server";
139
import { CrashTaskRunService } from "./crashTaskRun.server";
14-
15-
const FREEZABLE_RUN_STATUSES: TaskRunStatus[] = ["EXECUTING", "RETRYING_AFTER_FAILURE"];
16-
const FREEZABLE_ATTEMPT_STATUSES: TaskRunAttemptStatus[] = ["EXECUTING", "FAILED"];
10+
import { isFinalRunStatus, isFreezableAttemptStatus, isFreezableRunStatus } from "../taskStatus";
1711

1812
export class CreateCheckpointService extends BaseService {
1913
public async call(
@@ -49,8 +43,8 @@ export class CreateCheckpointService extends BaseService {
4943
}
5044

5145
if (
52-
!FREEZABLE_ATTEMPT_STATUSES.includes(attempt.status) ||
53-
!FREEZABLE_RUN_STATUSES.includes(attempt.taskRun.status)
46+
!isFreezableAttemptStatus(attempt.status) ||
47+
!isFreezableRunStatus(attempt.taskRun.status)
5448
) {
5549
logger.error("Unfreezable state", {
5650
attempt: {

apps/webapp/app/v3/services/restoreCheckpoint.server.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
import { TaskRunAttemptStatus, TaskRunStatus, type Checkpoint } from "@trigger.dev/database";
1+
import { type Checkpoint } from "@trigger.dev/database";
22
import { logger } from "~/services/logger.server";
33
import { socketIo } from "../handleSocketIo.server";
44
import { machinePresetFromConfig } from "../machinePresets.server";
55
import { BaseService } from "./baseService.server";
66
import { CreateCheckpointRestoreEventService } from "./createCheckpointRestoreEvent.server";
7-
8-
const RESTORABLE_RUN_STATUSES: TaskRunStatus[] = ["WAITING_TO_RESUME"];
9-
const RESTORABLE_ATTEMPT_STATUSES: TaskRunAttemptStatus[] = ["PAUSED"];
7+
import { isRestorableAttemptStatus, isRestorableRunStatus } from "../taskStatus";
108

119
export class RestoreCheckpointService extends BaseService {
1210
public async call(params: {
@@ -51,10 +49,7 @@ export class RestoreCheckpointService extends BaseService {
5149

5250
const checkpoint = checkpointEvent.checkpoint;
5351

54-
const runIsRestorable = RESTORABLE_RUN_STATUSES.includes(checkpoint.run.status);
55-
const attemptIsRestorable = RESTORABLE_ATTEMPT_STATUSES.includes(checkpoint.attempt.status);
56-
57-
if (!runIsRestorable) {
52+
if (!isRestorableRunStatus(checkpoint.run.status)) {
5853
logger.error("Run is unrestorable", {
5954
eventId: params.eventId,
6055
runId: checkpoint.runId,
@@ -64,7 +59,7 @@ export class RestoreCheckpointService extends BaseService {
6459
return;
6560
}
6661

67-
if (!attemptIsRestorable && !params.isRetry) {
62+
if (!isRestorableAttemptStatus(checkpoint.attempt.status) && !params.isRetry) {
6863
logger.error("Attempt is unrestorable", {
6964
eventId: params.eventId,
7065
runId: checkpoint.runId,

apps/webapp/app/v3/taskStatus.ts

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import { TaskRunAttemptStatus, TaskRunStatus } from "@trigger.dev/database";
2+
3+
export const CANCELLABLE_RUN_STATUSES: TaskRunStatus[] = [
4+
"PENDING",
5+
"WAITING_FOR_DEPLOY",
6+
"EXECUTING",
7+
"PAUSED",
8+
"WAITING_TO_RESUME",
9+
"PAUSED",
10+
"RETRYING_AFTER_FAILURE",
11+
];
12+
export const CANCELLABLE_ATTEMPT_STATUSES: TaskRunAttemptStatus[] = [
13+
"EXECUTING",
14+
"PAUSED",
15+
"PENDING",
16+
];
17+
18+
export function isCancellableRunStatus(status: TaskRunStatus): boolean {
19+
return CANCELLABLE_RUN_STATUSES.includes(status);
20+
}
21+
export function isCancellableAttemptStatus(status: TaskRunAttemptStatus): boolean {
22+
return CANCELLABLE_ATTEMPT_STATUSES.includes(status);
23+
}
24+
25+
export const CRASHABLE_RUN_STATUSES: TaskRunStatus[] = CANCELLABLE_RUN_STATUSES;
26+
export const CRASHABLE_ATTEMPT_STATUSES: TaskRunAttemptStatus[] = CANCELLABLE_ATTEMPT_STATUSES;
27+
28+
export function isCrashableRunStatus(status: TaskRunStatus): boolean {
29+
return CRASHABLE_RUN_STATUSES.includes(status);
30+
}
31+
export function isCrashableAttemptStatus(status: TaskRunAttemptStatus): boolean {
32+
return CRASHABLE_ATTEMPT_STATUSES.includes(status);
33+
}
34+
35+
export const FINAL_RUN_STATUSES: TaskRunStatus[] = [
36+
"CANCELED",
37+
"COMPLETED_SUCCESSFULLY",
38+
"COMPLETED_WITH_ERRORS",
39+
"INTERRUPTED",
40+
"SYSTEM_FAILURE",
41+
];
42+
export const FINAL_ATTEMPT_STATUSES: TaskRunAttemptStatus[] = ["CANCELED", "COMPLETED", "FAILED"];
43+
44+
export const FREEZABLE_RUN_STATUSES: TaskRunStatus[] = ["EXECUTING", "RETRYING_AFTER_FAILURE"];
45+
export const FREEZABLE_ATTEMPT_STATUSES: TaskRunAttemptStatus[] = ["EXECUTING", "FAILED"];
46+
47+
export function isFreezableRunStatus(status: TaskRunStatus): boolean {
48+
return FREEZABLE_RUN_STATUSES.includes(status);
49+
}
50+
export function isFreezableAttemptStatus(status: TaskRunAttemptStatus): boolean {
51+
return FREEZABLE_ATTEMPT_STATUSES.includes(status);
52+
}
53+
54+
export function isFinalRunStatus(status: TaskRunStatus): boolean {
55+
return FINAL_RUN_STATUSES.includes(status);
56+
}
57+
export function isFinalAttemptStatus(status: TaskRunAttemptStatus): boolean {
58+
return FINAL_ATTEMPT_STATUSES.includes(status);
59+
}
60+
61+
export const RESTORABLE_RUN_STATUSES: TaskRunStatus[] = ["WAITING_TO_RESUME"];
62+
export const RESTORABLE_ATTEMPT_STATUSES: TaskRunAttemptStatus[] = ["PAUSED"];
63+
64+
export function isRestorableRunStatus(status: TaskRunStatus): boolean {
65+
return RESTORABLE_RUN_STATUSES.includes(status);
66+
}
67+
export function isRestorableAttemptStatus(status: TaskRunAttemptStatus): boolean {
68+
return RESTORABLE_ATTEMPT_STATUSES.includes(status);
69+
}

0 commit comments

Comments
 (0)