Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .server-changes/strip-background-worker-metadata.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
area: webapp
type: improvement
---

Strip BackgroundWorker.metadata to the schedule slice read at deploy promotion, removing a 5+ second event-loop block in Prisma's client serializer when creating workers for projects with many tasks or source files.
29 changes: 27 additions & 2 deletions apps/webapp/app/v3/services/createBackgroundWorker.server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,32 @@ import { tryCatch } from "@trigger.dev/core/v3";
import { engine } from "../runEngine.server";
import { scheduleEngine } from "../scheduleEngine.server";

/**
* Strip BackgroundWorkerMetadata down to the slice that's actually read after
* storage. Everything else is duplicated to dedicated columns/tables
* (BackgroundWorker.{contentHash,cliVersion,sdkVersion,runtime,runtimeVersion},
* BackgroundWorkerTask, BackgroundWorkerFile, TaskQueue, Prompt). Today the
* only post-write reader is changeCurrentDeployment.server.ts, which feeds
* tasks[].schedule into syncDeclarativeSchedules. packageVersion, contentHash,
* and tasks[].filePath are kept solely to satisfy BackgroundWorkerMetadata's
* required fields when the column is parsed back.
*/
export function stripBackgroundWorkerMetadataForStorage(
metadata: BackgroundWorkerMetadata
): Prisma.InputJsonValue {
return {
packageVersion: metadata.packageVersion,
contentHash: metadata.contentHash,
tasks: metadata.tasks
.filter((t) => t.schedule)
.map((t) => ({
id: t.id,
filePath: t.filePath,
schedule: t.schedule,
})),
};
}

export class CreateBackgroundWorkerService extends BaseService {
public async call(
projectRef: string,
Expand Down Expand Up @@ -79,8 +105,7 @@ export class CreateBackgroundWorkerService extends BaseService {
version: nextVersion,
runtimeEnvironmentId: environment.id,
projectId: project.id,
// body.metadata has an index signature that Prisma doesn't like (from the JSONSchema type) so we are safe to just cast it
metadata: body.metadata as Prisma.InputJsonValue,
metadata: stripBackgroundWorkerMetadataForStorage(body.metadata),
contentHash: body.metadata.contentHash,
cliVersion: body.metadata.cliPackageVersion,
sdkVersion: body.metadata.packageVersion,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
import { CreateBackgroundWorkerRequestBody, tryCatch } from "@trigger.dev/core/v3";
import type { BackgroundWorker, Prisma } from "@trigger.dev/database";
import type { BackgroundWorker } from "@trigger.dev/database";
import { AuthenticatedEnvironment } from "~/services/apiAuth.server";
import { logger } from "~/services/logger.server";
import { syncTaskIdentifiers } from "~/services/taskIdentifierRegistry.server";
import { socketIo } from "../handleSocketIo.server";
import { updateEnvConcurrencyLimits } from "../runQueue.server";
import { PerformDeploymentAlertsService } from "./alerts/performDeploymentAlerts.server";
import { BaseService } from "./baseService.server";
import { createWorkerResources, syncDeclarativeSchedules } from "./createBackgroundWorker.server";
import {
createWorkerResources,
stripBackgroundWorkerMetadataForStorage,
syncDeclarativeSchedules,
} from "./createBackgroundWorker.server";
import { ExecuteTasksWaitingForDeployService } from "./executeTasksWaitingForDeploy";
import { projectPubSub } from "./projectPubSub.server";
import { TimeoutDeploymentService } from "./timeoutDeployment.server";
Expand Down Expand Up @@ -49,8 +53,7 @@ export class CreateDeploymentBackgroundWorkerServiceV3 extends BaseService {
version: deployment.version,
runtimeEnvironmentId: environment.id,
projectId: environment.projectId,
// body.metadata has an index signature that Prisma doesn't like (from the JSONSchema type) so we are safe to just cast it
metadata: body.metadata as Prisma.InputJsonValue,
metadata: stripBackgroundWorkerMetadataForStorage(body.metadata),
contentHash: body.metadata.contentHash,
cliVersion: body.metadata.cliPackageVersion,
sdkVersion: body.metadata.packageVersion,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { CreateBackgroundWorkerRequestBody, logger, tryCatch } from "@trigger.dev/core/v3";
import { BackgroundWorkerId } from "@trigger.dev/core/v3/isomorphic";
import type { BackgroundWorker, Prisma, WorkerDeployment } from "@trigger.dev/database";
import type { BackgroundWorker, WorkerDeployment } from "@trigger.dev/database";
import { AuthenticatedEnvironment } from "~/services/apiAuth.server";
import { BaseService, ServiceValidationError } from "./baseService.server";
import {
createBackgroundFiles,
createWorkerResources,
stripBackgroundWorkerMetadataForStorage,
syncDeclarativeSchedules,
} from "./createBackgroundWorker.server";
import { TimeoutDeploymentService } from "./timeoutDeployment.server";
Expand Down Expand Up @@ -65,8 +66,7 @@ export class CreateDeploymentBackgroundWorkerServiceV4 extends BaseService {
version: deployment.version,
runtimeEnvironmentId: environment.id,
projectId: environment.projectId,
// body.metadata has an index signature that Prisma doesn't like (from the JSONSchema type) so we are safe to just cast it
metadata: body.metadata as Prisma.InputJsonValue,
metadata: stripBackgroundWorkerMetadataForStorage(body.metadata),
contentHash: body.metadata.contentHash,
cliVersion: body.metadata.cliPackageVersion,
sdkVersion: body.metadata.packageVersion,
Expand Down
Loading