From c9f255209b1f8c51bf5b330c7cc27ffd1a9d1ea7 Mon Sep 17 00:00:00 2001 From: nicktrn <55853254+nicktrn@users.noreply.github.com> Date: Tue, 28 Oct 2025 10:01:49 +0000 Subject: [PATCH 1/4] fix(webapp): display correct concurrency override base value --- .../route.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx index 3a6b3189e4..d3ad36b997 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx @@ -970,10 +970,10 @@ function QueueOverrideConcurrencyButton({ {isOverridden ? ( This queue's concurrency limit is currently overridden to {currentLimit}. - {queue.concurrencyLimit !== null && - ` The original limit set in code was ${queue.concurrencyLimit}.`}{" "} + {queue.concurrencyLimitBase !== null && + ` The original limit set in code was ${queue.concurrencyLimitBase}.`}{" "} You can update the override or remove it to restore the{" "} - {queue.concurrencyLimit !== null + {queue.concurrencyLimitBase !== null ? "limit set in code" : "environment concurrency limit"} . From 580c617e77451c6ed7019bc16edc61de47ec7552 Mon Sep 17 00:00:00 2001 From: nicktrn <55853254+nicktrn@users.noreply.github.com> Date: Tue, 28 Oct 2025 10:02:17 +0000 Subject: [PATCH 2/4] fix(webapp): persist concurrency overrides on deploy --- .../services/createBackgroundWorker.server.ts | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/apps/webapp/app/v3/services/createBackgroundWorker.server.ts b/apps/webapp/app/v3/services/createBackgroundWorker.server.ts index ea43bbe425..32ca7910f1 100644 --- a/apps/webapp/app/v3/services/createBackgroundWorker.server.ts +++ b/apps/webapp/app/v3/services/createBackgroundWorker.server.ts @@ -359,7 +359,7 @@ async function createWorkerQueue( ) { let queueName = sanitizeQueueName(queue.name); - const concurrencyLimit = + const baseConcurrencyLimit = typeof queue.concurrencyLimit === "number" ? Math.max( Math.min( @@ -373,24 +373,26 @@ async function createWorkerQueue( const taskQueue = await upsertWorkerQueueRecord( queueName, - concurrencyLimit ?? null, + baseConcurrencyLimit ?? null, orderableName, queueType, worker, prisma ); + const newConcurrencyLimit = taskQueue.concurrencyLimit; + if (!taskQueue.paused) { - if (typeof concurrencyLimit === "number") { + if (typeof newConcurrencyLimit === "number") { logger.debug("createWorkerQueue: updating concurrency limit", { workerId: worker.id, taskQueue, orgId: environment.organizationId, projectId: environment.projectId, environmentId: environment.id, - concurrencyLimit, + concurrencyLimit: newConcurrencyLimit, }); - await updateQueueConcurrencyLimits(environment, taskQueue.name, concurrencyLimit); + await updateQueueConcurrencyLimits(environment, taskQueue.name, newConcurrencyLimit); } else { logger.debug("createWorkerQueue: removing concurrency limit", { workerId: worker.id, @@ -398,7 +400,7 @@ async function createWorkerQueue( orgId: environment.organizationId, projectId: environment.projectId, environmentId: environment.id, - concurrencyLimit, + concurrencyLimit: newConcurrencyLimit, }); await removeQueueConcurrencyLimits(environment, taskQueue.name); } @@ -455,6 +457,8 @@ async function upsertWorkerQueueRecord( }, }); } else { + const hasOverride = taskQueue.concurrencyLimitOverriddenAt !== null; + taskQueue = await prisma.taskQueue.update({ where: { id: taskQueue.id, @@ -463,7 +467,9 @@ async function upsertWorkerQueueRecord( workers: { connect: { id: worker.id } }, version: "V2", orderableName, - concurrencyLimit, + // If overridden, keep current limit and update base; otherwise update limit normally + concurrencyLimit: hasOverride ? undefined : concurrencyLimit, + concurrencyLimitBase: hasOverride ? concurrencyLimit : undefined, }, }); } From 9e0780fc8faec9554565d9c193c5f3f71ebf1b77 Mon Sep 17 00:00:00 2001 From: nicktrn <55853254+nicktrn@users.noreply.github.com> Date: Tue, 28 Oct 2025 10:23:16 +0000 Subject: [PATCH 3/4] fix(webapp): use correct override base value type --- .../route.tsx | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx index d3ad36b997..9069109b06 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx @@ -12,6 +12,7 @@ import { DialogClose } from "@radix-ui/react-dialog"; import { Form, useNavigation, useSearchParams, type MetaFunction } from "@remix-run/react"; import { type ActionFunctionArgs, type LoaderFunctionArgs } from "@remix-run/server-runtime"; import type { RuntimeEnvironmentType } from "@trigger.dev/database"; +import type { QueueItem } from "@trigger.dev/core/v3/schemas"; import { useEffect, useState } from "react"; import { typedjson, useTypedLoaderData } from "remix-typedjson"; import { z } from "zod"; @@ -926,12 +927,7 @@ function QueueOverrideConcurrencyButton({ queue, environmentConcurrencyLimit, }: { - queue: { - id: string; - name: string; - concurrencyLimit: number | null; - concurrency?: { overriddenAt: Date | null }; - }; + queue: QueueItem; environmentConcurrencyLimit: number; }) { const navigation = useNavigation(); @@ -970,10 +966,10 @@ function QueueOverrideConcurrencyButton({ {isOverridden ? ( This queue's concurrency limit is currently overridden to {currentLimit}. - {queue.concurrencyLimitBase !== null && - ` The original limit set in code was ${queue.concurrencyLimitBase}.`}{" "} + {typeof queue.concurrency?.base === "number" && + ` The original limit set in code was ${queue.concurrency.base}.`}{" "} You can update the override or remove it to restore the{" "} - {queue.concurrencyLimitBase !== null + {typeof queue.concurrency?.base === "number" ? "limit set in code" : "environment concurrency limit"} . From 0f7b8cd95f36b017f0ef5930df914eacd8d19057 Mon Sep 17 00:00:00 2001 From: nicktrn <55853254+nicktrn@users.noreply.github.com> Date: Tue, 28 Oct 2025 10:29:41 +0000 Subject: [PATCH 4/4] fix(webapp): override input is bounded by env concurrency --- .../route.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx index 9069109b06..12d8cf208d 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx @@ -991,6 +991,7 @@ function QueueOverrideConcurrencyButton({ name="concurrencyLimit" id="concurrencyLimit" min="0" + max={environmentConcurrencyLimit} value={concurrencyLimit} onChange={(e) => setConcurrencyLimit(e.target.value)} placeholder={currentLimit.toString()}