Skip to content

Commit 446ad0d

Browse files
committed
perf(run-engine,webapp): narrow the control-plane worker-version read to the columns dequeue uses
The worker-version resolve path fetched every column of every BackgroundWorkerTask for a worker (include: { tasks: true }) plus full WorkerDeployment and TaskQueue rows just to match one task at dequeue, pulling large JSON columns none of this path reads (task payloadSchema, config, queueConfig, description; deployment externalBuildData, buildServerMetadata, errorData, git; queue rateLimit). Replace the includes with explicit selects of only the columns dequeue uses, in both the passthrough resolver and the app resolver: task { id, slug, machineConfig, retryConfig, maxDurationInSeconds }, deployment { id, friendlyId, imageReference, imagePlatform }, queue { id, name }. The shared ResolvedWorkerVersion element types narrow to match, which also shrinks each cached worker-version entry. No behavior change.
1 parent fe199f7 commit 446ad0d

6 files changed

Lines changed: 315 additions & 55 deletions

File tree

apps/webapp/app/v3/runOpsMigration/controlPlaneCache.server.ts

Lines changed: 59 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,4 @@
1-
import type {
2-
BackgroundWorker,
3-
BackgroundWorkerTask,
4-
Prisma,
5-
RuntimeEnvironmentType,
6-
TaskQueue,
7-
WorkerDeployment,
8-
} from "@trigger.dev/database";
1+
import type { BackgroundWorker, Prisma, RuntimeEnvironmentType } from "@trigger.dev/database";
92
import { BoundedTtlCache } from "~/services/realtime/boundedTtlCache";
103
import type { AuthenticatedEnvironment } from "@trigger.dev/core/v3/auth/environment";
114

@@ -49,12 +42,67 @@ export type ResolvedEnv = {
4942
concurrencyLimitBurstFactor: Prisma.Decimal;
5043
};
5144

45+
/**
46+
* The BackgroundWorkerTask columns the dequeue resolve path reads. Mirrors run-engine's
47+
* `ResolvedWorkerTask` exactly. The unread heavy JSON columns (`payloadSchema`, `config`,
48+
* `queueConfig`, `description`) are dropped so this hot control-plane read stops shipping
49+
* ~62KB/query (and each cached entry stays small); `machineConfig`/`retryConfig` are read
50+
* at dequeue and stay.
51+
*/
52+
export type ResolvedWorkerTask = {
53+
id: string;
54+
slug: string;
55+
machineConfig: Prisma.JsonValue | null;
56+
retryConfig: Prisma.JsonValue | null;
57+
maxDurationInSeconds: number | null;
58+
};
59+
60+
/** The `select` that yields a `ResolvedWorkerTask`. */
61+
export const resolvedWorkerTaskSelect = {
62+
id: true,
63+
slug: true,
64+
machineConfig: true,
65+
retryConfig: true,
66+
maxDurationInSeconds: true,
67+
} satisfies Prisma.BackgroundWorkerTaskSelect;
68+
69+
/** Mirrors run-engine's `ResolvedTaskQueue` exactly. `id` + `name` (the matcher keys on both). */
70+
export type ResolvedTaskQueue = {
71+
id: string;
72+
name: string;
73+
};
74+
75+
/** The `select` that yields a `ResolvedTaskQueue`. */
76+
export const resolvedTaskQueueSelect = {
77+
id: true,
78+
name: true,
79+
} satisfies Prisma.TaskQueueSelect;
80+
81+
/**
82+
* Mirrors run-engine's `ResolvedWorkerDeployment` exactly. Drops the unread heavy JSON columns
83+
* (`externalBuildData`, `buildServerMetadata`, `errorData`, `git`) from this single-row read.
84+
*/
85+
export type ResolvedWorkerDeployment = {
86+
id: string;
87+
friendlyId: string;
88+
imageReference: string | null;
89+
imagePlatform: string;
90+
};
91+
92+
/** The `select` that yields a `ResolvedWorkerDeployment`. */
93+
export const resolvedWorkerDeploymentSelect = {
94+
id: true,
95+
friendlyId: true,
96+
imageReference: true,
97+
imagePlatform: true,
98+
} satisfies Prisma.WorkerDeploymentSelect;
99+
52100
/** Mirrors `WorkerDeploymentWithWorkerTasks` in `dequeueSystem.ts` exactly. */
53101
export type ResolvedWorkerVersion = {
54102
worker: BackgroundWorker;
55-
tasks: BackgroundWorkerTask[];
56-
queues: TaskQueue[];
57-
deployment: WorkerDeployment | null;
103+
tasks: ResolvedWorkerTask[];
104+
queues: ResolvedTaskQueue[];
105+
deployment: ResolvedWorkerDeployment | null;
58106
};
59107

60108
// The canonical authenticated-environment shape (slug/type/project/organization/orgMember/…)

apps/webapp/app/v3/runOpsMigration/controlPlaneResolver.server.ts

Lines changed: 52 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import {
1010
ControlPlaneCache,
1111
DEFAULT_CP_CACHE_MAX_ENTRIES,
1212
DEFAULT_CP_CACHE_TTL_MS,
13+
resolvedTaskQueueSelect,
14+
resolvedWorkerDeploymentSelect,
15+
resolvedWorkerTaskSelect,
1316
type ResolvedAuthenticatedEnv,
1417
type ResolvedEnv,
1518
type ResolvedWorkerVersion,
@@ -389,7 +392,11 @@ export class ControlPlaneResolver {
389392
if (backgroundWorkerId) {
390393
const worker = await client.backgroundWorker.findFirst({
391394
where: { id: backgroundWorkerId },
392-
include: { deployment: true, tasks: true, queues: true },
395+
include: {
396+
deployment: { select: resolvedWorkerDeploymentSelect },
397+
tasks: { select: resolvedWorkerTaskSelect },
398+
queues: { select: resolvedTaskQueueSelect },
399+
},
393400
});
394401

395402
if (!worker) {
@@ -411,7 +418,16 @@ export class ControlPlaneResolver {
411418
where: { environmentId, label: CURRENT_DEPLOYMENT_LABEL },
412419
include: {
413420
deployment: {
414-
include: { worker: { include: { tasks: true, queues: true } } },
421+
select: {
422+
...resolvedWorkerDeploymentSelect,
423+
type: true,
424+
worker: {
425+
include: {
426+
tasks: { select: resolvedWorkerTaskSelect },
427+
queues: { select: resolvedTaskQueueSelect },
428+
},
429+
},
430+
},
415431
},
416432
},
417433
});
@@ -421,11 +437,17 @@ export class ControlPlaneResolver {
421437
}
422438

423439
if (type === undefined || promotion.deployment.type === "MANAGED") {
440+
const { worker } = promotion.deployment;
424441
return {
425-
worker: promotion.deployment.worker,
426-
tasks: promotion.deployment.worker.tasks,
427-
queues: promotion.deployment.worker.queues,
428-
deployment: promotion.deployment,
442+
worker,
443+
tasks: worker.tasks,
444+
queues: worker.queues,
445+
deployment: {
446+
id: promotion.deployment.id,
447+
friendlyId: promotion.deployment.friendlyId,
448+
imageReference: promotion.deployment.imageReference,
449+
imagePlatform: promotion.deployment.imagePlatform,
450+
},
429451
};
430452
}
431453

@@ -434,7 +456,15 @@ export class ControlPlaneResolver {
434456
const latestV2Deployment = await client.workerDeployment.findFirst({
435457
where: { environmentId, type: "MANAGED" },
436458
orderBy: [{ createdAt: "desc" }, { id: "desc" }],
437-
include: { worker: { include: { tasks: true, queues: true } } },
459+
select: {
460+
...resolvedWorkerDeploymentSelect,
461+
worker: {
462+
include: {
463+
tasks: { select: resolvedWorkerTaskSelect },
464+
queues: { select: resolvedTaskQueueSelect },
465+
},
466+
},
467+
},
438468
});
439469

440470
if (!latestV2Deployment?.worker) {
@@ -445,7 +475,12 @@ export class ControlPlaneResolver {
445475
worker: latestV2Deployment.worker,
446476
tasks: latestV2Deployment.worker.tasks,
447477
queues: latestV2Deployment.worker.queues,
448-
deployment: latestV2Deployment,
478+
deployment: {
479+
id: latestV2Deployment.id,
480+
friendlyId: latestV2Deployment.friendlyId,
481+
imageReference: latestV2Deployment.imageReference,
482+
imagePlatform: latestV2Deployment.imagePlatform,
483+
},
449484
};
450485
}
451486

@@ -455,7 +490,11 @@ export class ControlPlaneResolver {
455490
): Promise<ResolvedWorkerVersion | null> {
456491
const worker = await client.backgroundWorker.findFirst({
457492
where: { id: workerId },
458-
include: { deployment: true, tasks: true, queues: true },
493+
include: {
494+
deployment: { select: resolvedWorkerDeploymentSelect },
495+
tasks: { select: resolvedWorkerTaskSelect },
496+
queues: { select: resolvedTaskQueueSelect },
497+
},
459498
});
460499

461500
if (!worker) {
@@ -471,7 +510,10 @@ export class ControlPlaneResolver {
471510
): Promise<ResolvedWorkerVersion | null> {
472511
const worker = await client.backgroundWorker.findFirst({
473512
where: { runtimeEnvironmentId: environmentId },
474-
include: { tasks: true, queues: true },
513+
include: {
514+
tasks: { select: resolvedWorkerTaskSelect },
515+
queues: { select: resolvedTaskQueueSelect },
516+
},
475517
orderBy: [{ createdAt: "desc" }, { id: "desc" }],
476518
});
477519

internal-packages/run-engine/src/engine/controlPlaneResolver.ts

Lines changed: 94 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
import type {
22
BackgroundWorker,
3-
BackgroundWorkerTask,
43
Prisma,
54
PrismaClient,
65
RuntimeEnvironmentType,
7-
TaskQueue,
8-
WorkerDeployment,
96
} from "@trigger.dev/database";
107
import { CURRENT_DEPLOYMENT_LABEL } from "@trigger.dev/core/v3/isomorphic";
118
import type { AuthenticatedEnvironment } from "@trigger.dev/core/v3/auth/environment";
@@ -51,12 +48,70 @@ export type ResolvedEngineEnv = {
5148
*/
5249
export type ResolvedAuthenticatedEnv = AuthenticatedEnvironment & { git: Prisma.JsonValue | null };
5350

51+
/**
52+
* The BackgroundWorkerTask columns the dequeue resolve path actually reads. The worker's
53+
* whole task set (~73 rows) is fetched for one matched task, so pulling the unread heavy
54+
* JSON columns (`payloadSchema`, `config`, `queueConfig`, `description`) shipped ~62KB/query
55+
* on the hottest control-plane read. `machineConfig`/`retryConfig` are read at dequeue and stay.
56+
*/
57+
export type ResolvedWorkerTask = {
58+
id: string;
59+
slug: string;
60+
machineConfig: Prisma.JsonValue | null;
61+
retryConfig: Prisma.JsonValue | null;
62+
maxDurationInSeconds: number | null;
63+
};
64+
65+
/** The `select` that yields a `ResolvedWorkerTask`. */
66+
export const resolvedWorkerTaskSelect = {
67+
id: true,
68+
slug: true,
69+
machineConfig: true,
70+
retryConfig: true,
71+
maxDurationInSeconds: true,
72+
} satisfies Prisma.BackgroundWorkerTaskSelect;
73+
74+
/**
75+
* The TaskQueue columns the dequeue resolve path uses: `id` and `name` (the matcher keys on
76+
* `lockedQueueId`/`name`). Drops the unread `rateLimit` JSON and the concurrency/type scalars.
77+
*/
78+
export type ResolvedTaskQueue = {
79+
id: string;
80+
name: string;
81+
};
82+
83+
/** The `select` that yields a `ResolvedTaskQueue`. */
84+
export const resolvedTaskQueueSelect = {
85+
id: true,
86+
name: true,
87+
} satisfies Prisma.TaskQueueSelect;
88+
89+
/**
90+
* The WorkerDeployment columns the dequeue resolve path reads: `id`, `friendlyId`,
91+
* `imageReference`, `imagePlatform`. Drops the unread heavy JSON columns (`externalBuildData`,
92+
* `buildServerMetadata`, `errorData`, `git`) that this single-row read otherwise ships.
93+
*/
94+
export type ResolvedWorkerDeployment = {
95+
id: string;
96+
friendlyId: string;
97+
imageReference: string | null;
98+
imagePlatform: string;
99+
};
100+
101+
/** The `select` that yields a `ResolvedWorkerDeployment`. */
102+
export const resolvedWorkerDeploymentSelect = {
103+
id: true,
104+
friendlyId: true,
105+
imageReference: true,
106+
imagePlatform: true,
107+
} satisfies Prisma.WorkerDeploymentSelect;
108+
54109
/** Identical to dequeue's `WorkerDeploymentWithWorkerTasks`. */
55110
export type ResolvedWorkerVersion = {
56111
worker: BackgroundWorker;
57-
tasks: BackgroundWorkerTask[];
58-
queues: TaskQueue[];
59-
deployment: WorkerDeployment | null;
112+
tasks: ResolvedWorkerTask[];
113+
queues: ResolvedTaskQueue[];
114+
deployment: ResolvedWorkerDeployment | null;
60115
};
61116

62117
export interface ControlPlaneResolver {
@@ -207,9 +262,9 @@ export class PassthroughControlPlaneResolver implements ControlPlaneResolver {
207262
id: workerId,
208263
},
209264
include: {
210-
deployment: true,
211-
tasks: true,
212-
queues: true,
265+
deployment: { select: resolvedWorkerDeploymentSelect },
266+
tasks: { select: resolvedWorkerTaskSelect },
267+
queues: { select: resolvedTaskQueueSelect },
213268
},
214269
});
215270

@@ -231,8 +286,8 @@ export class PassthroughControlPlaneResolver implements ControlPlaneResolver {
231286
runtimeEnvironmentId: environmentId,
232287
},
233288
include: {
234-
tasks: true,
235-
queues: true,
289+
tasks: { select: resolvedWorkerTaskSelect },
290+
queues: { select: resolvedTaskQueueSelect },
236291
},
237292
orderBy: [{ createdAt: "desc" }, { id: "desc" }],
238293
});
@@ -250,9 +305,9 @@ export class PassthroughControlPlaneResolver implements ControlPlaneResolver {
250305
id: workerId,
251306
},
252307
include: {
253-
deployment: true,
254-
tasks: true,
255-
queues: true,
308+
deployment: { select: resolvedWorkerDeploymentSelect },
309+
tasks: { select: resolvedWorkerTaskSelect },
310+
queues: { select: resolvedTaskQueueSelect },
256311
},
257312
});
258313

@@ -278,11 +333,13 @@ export class PassthroughControlPlaneResolver implements ControlPlaneResolver {
278333
},
279334
include: {
280335
deployment: {
281-
include: {
336+
select: {
337+
...resolvedWorkerDeploymentSelect,
338+
type: true,
282339
worker: {
283340
include: {
284-
tasks: true,
285-
queues: true,
341+
tasks: { select: resolvedWorkerTaskSelect },
342+
queues: { select: resolvedTaskQueueSelect },
286343
},
287344
},
288345
},
@@ -296,11 +353,17 @@ export class PassthroughControlPlaneResolver implements ControlPlaneResolver {
296353

297354
if (promotion.deployment.type === "MANAGED") {
298355
// This is a run engine v2 deployment, so return it
356+
const { worker } = promotion.deployment;
299357
return {
300-
worker: promotion.deployment.worker,
301-
tasks: promotion.deployment.worker.tasks,
302-
queues: promotion.deployment.worker.queues,
303-
deployment: promotion.deployment,
358+
worker,
359+
tasks: worker.tasks,
360+
queues: worker.queues,
361+
deployment: {
362+
id: promotion.deployment.id,
363+
friendlyId: promotion.deployment.friendlyId,
364+
imageReference: promotion.deployment.imageReference,
365+
imagePlatform: promotion.deployment.imagePlatform,
366+
},
304367
};
305368
}
306369

@@ -311,11 +374,12 @@ export class PassthroughControlPlaneResolver implements ControlPlaneResolver {
311374
type: "MANAGED",
312375
},
313376
orderBy: [{ createdAt: "desc" }, { id: "desc" }],
314-
include: {
377+
select: {
378+
...resolvedWorkerDeploymentSelect,
315379
worker: {
316380
include: {
317-
tasks: true,
318-
queues: true,
381+
tasks: { select: resolvedWorkerTaskSelect },
382+
queues: { select: resolvedTaskQueueSelect },
319383
},
320384
},
321385
},
@@ -329,7 +393,12 @@ export class PassthroughControlPlaneResolver implements ControlPlaneResolver {
329393
worker: latestV2Deployment.worker,
330394
tasks: latestV2Deployment.worker.tasks,
331395
queues: latestV2Deployment.worker.queues,
332-
deployment: latestV2Deployment,
396+
deployment: {
397+
id: latestV2Deployment.id,
398+
friendlyId: latestV2Deployment.friendlyId,
399+
imageReference: latestV2Deployment.imageReference,
400+
imagePlatform: latestV2Deployment.imagePlatform,
401+
},
333402
};
334403
}
335404
}

0 commit comments

Comments
 (0)