From dc2810920d5a3254101532c95c4979d5acb93339 Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Wed, 21 Jan 2026 14:41:54 +0000 Subject: [PATCH] fix(run-engine): use replica for pending version queries Move expensive findMany queries for PENDING_VERSION and WAITING_FOR_DEPLOY runs to read replicas to avoid blocking migrations on the primary database. Changes: - Add readOnlyPrisma to SystemResources type - Pass readOnlyPrisma to systems in RunEngine constructor - Update pendingVersionSystem to use readOnlyPrisma for findMany - Update executeTasksWaitingForDeploy to use _replica for findMany --- apps/webapp/app/v3/services/executeTasksWaitingForDeploy.ts | 2 +- internal-packages/run-engine/src/engine/index.ts | 1 + .../run-engine/src/engine/systems/pendingVersionSystem.ts | 2 +- internal-packages/run-engine/src/engine/systems/systems.ts | 3 ++- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/webapp/app/v3/services/executeTasksWaitingForDeploy.ts b/apps/webapp/app/v3/services/executeTasksWaitingForDeploy.ts index 931c804614..7839b9e6e0 100644 --- a/apps/webapp/app/v3/services/executeTasksWaitingForDeploy.ts +++ b/apps/webapp/app/v3/services/executeTasksWaitingForDeploy.ts @@ -33,7 +33,7 @@ export class ExecuteTasksWaitingForDeployService extends BaseService { const maxCount = env.LEGACY_RUN_ENGINE_WAITING_FOR_DEPLOY_BATCH_SIZE; - const runsWaitingForDeploy = await this._prisma.taskRun.findMany({ + const runsWaitingForDeploy = await this._replica.taskRun.findMany({ where: { runtimeEnvironmentId: backgroundWorker.runtimeEnvironmentId, projectId: backgroundWorker.projectId, diff --git a/internal-packages/run-engine/src/engine/index.ts b/internal-packages/run-engine/src/engine/index.ts index 1021c32fbf..9e81c99132 100644 --- a/internal-packages/run-engine/src/engine/index.ts +++ b/internal-packages/run-engine/src/engine/index.ts @@ -268,6 +268,7 @@ export class RunEngine { const resources: SystemResources = { prisma: this.prisma, + readOnlyPrisma: this.readOnlyPrisma, worker: this.worker, eventBus: this.eventBus, logger: this.logger, diff --git a/internal-packages/run-engine/src/engine/systems/pendingVersionSystem.ts b/internal-packages/run-engine/src/engine/systems/pendingVersionSystem.ts index 6dcb4f6eb0..c22429ac0c 100644 --- a/internal-packages/run-engine/src/engine/systems/pendingVersionSystem.ts +++ b/internal-packages/run-engine/src/engine/systems/pendingVersionSystem.ts @@ -50,7 +50,7 @@ export class PendingVersionSystem { queues: backgroundWorker.queues.map((queue) => queue.name), }); - const pendingRuns = await this.$.prisma.taskRun.findMany({ + const pendingRuns = await this.$.readOnlyPrisma.taskRun.findMany({ where: { runtimeEnvironmentId: backgroundWorker.runtimeEnvironmentId, projectId: backgroundWorker.projectId, diff --git a/internal-packages/run-engine/src/engine/systems/systems.ts b/internal-packages/run-engine/src/engine/systems/systems.ts index 35790259b4..909df71210 100644 --- a/internal-packages/run-engine/src/engine/systems/systems.ts +++ b/internal-packages/run-engine/src/engine/systems/systems.ts @@ -1,6 +1,6 @@ import { Meter, Tracer } from "@internal/tracing"; import { Logger } from "@trigger.dev/core/logger"; -import { PrismaClient } from "@trigger.dev/database"; +import { PrismaClient, PrismaReplicaClient } from "@trigger.dev/database"; import { RunQueue } from "../../run-queue/index.js"; import { EventBus } from "../eventBus.js"; import { RunLocker } from "../locking.js"; @@ -9,6 +9,7 @@ import { RaceSimulationSystem } from "./raceSimulationSystem.js"; export type SystemResources = { prisma: PrismaClient; + readOnlyPrisma: PrismaReplicaClient; worker: EngineWorker; eventBus: EventBus; logger: Logger;