Skip to content

Commit 1b7e8ec

Browse files
committed
fix(webapp): hide compute backing on read surfaces and fix replay
1 parent 96a59f0 commit 1b7e8ec

9 files changed

Lines changed: 58 additions & 12 deletions

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import assertNever from "assert-never";
1616
import { API_VERSIONS, CURRENT_API_VERSION, RunStatusUnspecifiedApiVersion } from "~/api/versions";
1717
import { $replica, prisma } from "~/db.server";
1818
import { baseWorkerQueue } from "~/runEngine/concerns/workerQueueSplit.server";
19+
import { regionForBacking } from "~/runEngine/concerns/computeMigration.server";
20+
import { computeBackingMap } from "~/v3/computeBackingMap.server";
1921
import { AuthenticatedEnvironment } from "~/services/apiAuth.server";
2022
import {
2123
findRunByIdWithMollifierFallback,
@@ -520,7 +522,9 @@ async function createCommonRunStructure(run: CommonRelatedRun, apiVersion: API_V
520522
triggerFunction: resolveTriggerFunction(run),
521523
batchId: run.batch?.friendlyId,
522524
metadata,
523-
region: run.workerQueue ? baseWorkerQueue(run.workerQueue) : undefined,
525+
region: run.workerQueue
526+
? regionForBacking(baseWorkerQueue(run.workerQueue), computeBackingMap)
527+
: undefined,
524528
};
525529
}
526530

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import { findDisplayableEnvironment } from "~/models/runtimeEnvironment.server";
1212
import { getTaskIdentifiers } from "~/models/task.server";
1313
import { RunsRepository } from "~/services/runsRepository/runsRepository.server";
1414
import { baseWorkerQueue } from "~/runEngine/concerns/workerQueueSplit.server";
15+
import { regionForBacking } from "~/runEngine/concerns/computeMigration.server";
16+
import { computeBackingMap } from "~/v3/computeBackingMap.server";
1517
import { machinePresetFromRun } from "~/v3/machinePresets.server";
1618
import { ServiceValidationError } from "~/v3/services/baseService.server";
1719
import { isCancellableRunStatus, isFinalRunStatus, isPendingRunStatus } from "~/v3/taskStatus";
@@ -260,7 +262,9 @@ export class NextRunListPresenter {
260262
name: run.queue.replace("task/", ""),
261263
type: run.queue.startsWith("task/") ? "task" : "custom",
262264
},
263-
region: run.workerQueue ? baseWorkerQueue(run.workerQueue) : undefined,
265+
region: run.workerQueue
266+
? regionForBacking(baseWorkerQueue(run.workerQueue), computeBackingMap)
267+
: undefined,
264268
taskKind: RunAnnotations.safeParse(run.annotations).data?.taskKind ?? "STANDARD",
265269
};
266270
}),

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import {
1616
} from "@trigger.dev/core/v3/serverOnly";
1717
import { RUNNING_STATUSES } from "~/components/runs/v3/TaskRunStatus";
1818
import { baseWorkerQueue } from "~/runEngine/concerns/workerQueueSplit.server";
19+
import { regionForBacking } from "~/runEngine/concerns/computeMigration.server";
20+
import { computeBackingMap } from "~/v3/computeBackingMap.server";
1921
import { logger } from "~/services/logger.server";
2022
import { rehydrateAttribute } from "~/v3/eventRepository/eventRepository.server";
2123
import { machinePresetFromRun } from "~/v3/machinePresets.server";
@@ -303,7 +305,7 @@ export class SpanPresenter extends BasePresenter {
303305
location: true,
304306
},
305307
where: {
306-
masterQueue: baseWorkerQueue(run.workerQueue),
308+
masterQueue: regionForBacking(baseWorkerQueue(run.workerQueue), computeBackingMap),
307309
},
308310
});
309311

apps/webapp/app/routes/resources.taskruns.$runParam.replay.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import {
1919
} from "~/v3/mollifier/syntheticReplayTaskRun.server";
2020
import parseDuration from "parse-duration";
2121
import { baseWorkerQueue } from "~/runEngine/concerns/workerQueueSplit.server";
22+
import { regionForBacking } from "~/runEngine/concerns/computeMigration.server";
23+
import { computeBackingMap } from "~/v3/computeBackingMap.server";
2224
import { findCurrentWorkerDeployment } from "~/v3/models/workerDeployment.server";
2325
import { queueTypeFromType } from "~/presenters/v3/QueueRetrievePresenter.server";
2426
import { ReplayRunData } from "~/v3/replayTask";
@@ -210,7 +212,10 @@ export async function loader({ request, params }: LoaderFunctionArgs) {
210212
maxAttempts: run.maxAttempts,
211213
maxDurationSeconds: run.maxDurationInSeconds,
212214
machinePreset: run.machinePreset,
213-
region: environment.type === "DEVELOPMENT" ? undefined : baseWorkerQueue(run.workerQueue),
215+
region:
216+
environment.type === "DEVELOPMENT"
217+
? undefined
218+
: regionForBacking(baseWorkerQueue(run.workerQueue), computeBackingMap),
214219
regions: regionsResult.regions,
215220
ttlSeconds: run.ttl ? parseDuration(run.ttl, "s") ?? undefined : undefined,
216221
idempotencyKey: run.idempotencyKey,

apps/webapp/app/runEngine/concerns/computeMigration.server.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,19 @@ export function parseComputeBackingMap(raw: string): ComputeBackingMap {
2828
}
2929
}
3030

31+
/**
32+
* Inverse of the backing map: given a worker queue, return the user-facing geo
33+
* region. If the queue is a compute backing (a *value* in the map), return the
34+
* region it backs; otherwise return the queue unchanged. Used to hide the
35+
* backing on customer surfaces and to re-derive the region on replay.
36+
*/
37+
export function regionForBacking(queue: string, backingMap: ComputeBackingMap): string {
38+
for (const [region, backing] of Object.entries(backingMap)) {
39+
if (backing === queue) return region;
40+
}
41+
return queue;
42+
}
43+
3144
type MigrationDecisionInput = {
3245
planType: string | undefined;
3346
orgId: string;

apps/webapp/app/runEngine/services/triggerTask.server.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,8 @@ import {
3838
resolveScheduledQueueSplitEnabled,
3939
workerQueueForRun,
4040
} from "../concerns/workerQueueSplit.server";
41-
import {
42-
parseComputeBackingMap,
43-
resolveComputeMigration,
44-
} from "../concerns/computeMigration.server";
41+
import { resolveComputeMigration } from "../concerns/computeMigration.server";
42+
import { computeBackingMap } from "~/v3/computeBackingMap.server";
4543
import { globalFlagsRegistry } from "~/v3/globalFlagsRegistry.server";
4644
import {
4745
publishClaim as publishMollifierClaim,
@@ -70,8 +68,6 @@ import { mollifyTrigger } from "~/v3/mollifier/mollifierMollify.server";
7068
import { type MollifierBuffer } from "@trigger.dev/redis-worker";
7169
import { QueueSizeLimitExceededError, ServiceValidationError } from "~/v3/services/common.server";
7270

73-
const COMPUTE_BACKING_MAP = parseComputeBackingMap(env.COMPUTE_BACKING_MAP);
74-
7571
class NoopTriggerRacepointSystem implements TriggerRacepointSystem {
7672
async waitForRacepoint(options: { racepoint: TriggerRacepoints; id: string }): Promise<void> {
7773
return;
@@ -379,7 +375,7 @@ export class RunEngineTriggerTaskService {
379375
orgFeatureFlags: environment.organization.featureFlags as Record<string, unknown> | null,
380376
flags: globalFlagsRegistry.current(),
381377
envType: environment.type,
382-
backingMap: COMPUTE_BACKING_MAP,
378+
backingMap: computeBackingMap,
383379
});
384380

385381
// Build annotations for this run
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { env } from "~/env.server";
2+
import { parseComputeBackingMap } from "~/runEngine/concerns/computeMigration.server";
3+
4+
/** Parsed once: region -> compute-backing worker queue. Operator env, rarely changes. */
5+
export const computeBackingMap = parseComputeBackingMap(env.COMPUTE_BACKING_MAP);

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import {
77
import { type TaskRun } from "@trigger.dev/database";
88
import { findEnvironmentById } from "~/models/runtimeEnvironment.server";
99
import { baseWorkerQueue } from "~/runEngine/concerns/workerQueueSplit.server";
10+
import { regionForBacking } from "~/runEngine/concerns/computeMigration.server";
11+
import { computeBackingMap } from "~/v3/computeBackingMap.server";
1012
import { logger } from "~/services/logger.server";
1113
import { BaseService } from "./baseService.server";
1214
import { OutOfEntitlementError, TriggerTaskService } from "./triggerTask.server";
@@ -68,7 +70,8 @@ export class ReplayTaskRunService extends BaseService {
6870
authenticatedEnvironment.type === "DEVELOPMENT";
6971
const region = ignoreRegion
7072
? undefined
71-
: overrideOptions.region ?? baseWorkerQueue(existingTaskRun.workerQueue);
73+
: overrideOptions.region ??
74+
regionForBacking(baseWorkerQueue(existingTaskRun.workerQueue), computeBackingMap);
7275

7376
try {
7477
const taskQueue = await this._prisma.taskQueue.findFirst({

apps/webapp/test/computeMigration.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
parseComputeBackingMap,
44
isOrgMigrated,
55
resolveComputeMigration,
6+
regionForBacking,
67
} from "~/runEngine/concerns/computeMigration.server";
78

89
const BACKING = { "us-east-1": "us-east-1-next" };
@@ -108,3 +109,16 @@ describe("resolveComputeMigration", () => {
108109
.toBeUndefined();
109110
});
110111
});
112+
113+
describe("regionForBacking", () => {
114+
it("maps a backing to its region", () => {
115+
expect(regionForBacking("us-east-1-next", BACKING)).toBe("us-east-1");
116+
});
117+
it("passes a non-backing queue through unchanged", () => {
118+
expect(regionForBacking("us-east-1", BACKING)).toBe("us-east-1");
119+
expect(regionForBacking("eu-central-1", BACKING)).toBe("eu-central-1");
120+
});
121+
it("passes through unchanged with an empty map", () => {
122+
expect(regionForBacking("us-east-1-next", {})).toBe("us-east-1-next");
123+
});
124+
});

0 commit comments

Comments
 (0)