Skip to content

Commit 7d1d8fb

Browse files
committed
feat(database,webapp): add WorkerInstanceGroup.region + worker-region registry
1 parent c4bf6f9 commit 7d1d8fb

4 files changed

Lines changed: 108 additions & 0 deletions

File tree

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { type WorkloadType } from "@trigger.dev/database";
2+
import { prisma } from "~/db.server";
3+
import { env } from "~/env.server";
4+
import { singleton } from "~/utils/singleton";
5+
import { createReloadingRegistry } from "~/utils/reloadingRegistry.server";
6+
7+
export type WorkerGroupRegionRow = {
8+
masterQueue: string;
9+
region: string | null;
10+
workloadType: WorkloadType;
11+
hidden: boolean;
12+
};
13+
14+
/**
15+
* Reverse map: a stored worker queue -> its user-facing geo region. A backing
16+
* queue (e.g. "us-east-1-next") returns the region it backs ("us-east-1");
17+
* anything unknown or with no region set passes through unchanged (so container
18+
* queues and not-yet-labelled groups behave exactly as before).
19+
*/
20+
export function regionForQueue(queue: string, groups: WorkerGroupRegionRow[]): string {
21+
const self = groups.find((g) => g.masterQueue === queue);
22+
return self?.region ?? queue;
23+
}
24+
25+
/**
26+
* Forward map: the compute (MICROVM) backing queue for the region that `queue`
27+
* belongs to, or undefined if the region has no compute backing. `queue` is the
28+
* resolved (container) worker queue; we look up its region, then find a visible
29+
* MICROVM group in the same region.
30+
*/
31+
export function backingForQueue(queue: string, groups: WorkerGroupRegionRow[]): string | undefined {
32+
const self = groups.find((g) => g.masterQueue === queue);
33+
const region = self?.region;
34+
if (!region) return undefined;
35+
const backing = groups.find(
36+
(g) =>
37+
g.workloadType === "MICROVM" &&
38+
g.region === region &&
39+
!g.hidden &&
40+
g.masterQueue !== queue
41+
);
42+
return backing?.masterQueue;
43+
}
44+
45+
/**
46+
* In-memory snapshot of every worker group's (queue, region, type, hidden),
47+
* refreshed on an interval. Read synchronously on the hot path; callers gate the
48+
* first read on `waitUntilReady`. Replaces the COMPUTE_BACKING_MAP env var as the
49+
* source of truth for region<->backing resolution.
50+
*/
51+
export const workerRegionRegistry = singleton("workerRegionRegistry", () =>
52+
createReloadingRegistry<WorkerGroupRegionRow[]>({
53+
name: "worker-region",
54+
intervalMs: env.GLOBAL_FLAGS_RELOAD_INTERVAL_MS,
55+
load: () =>
56+
prisma.workerInstanceGroup.findMany({
57+
select: { masterQueue: true, region: true, workloadType: true, hidden: true },
58+
}),
59+
})
60+
);
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { describe, it, expect } from "vitest";
2+
import { regionForQueue, backingForQueue, type WorkerGroupRegionRow } from "~/v3/workerRegions.server";
3+
4+
const groups: WorkerGroupRegionRow[] = [
5+
{ masterQueue: "us-east-1", region: "us-east-1", workloadType: "CONTAINER", hidden: false },
6+
{ masterQueue: "us-east-1-next", region: "us-east-1", workloadType: "MICROVM", hidden: false },
7+
{ masterQueue: "eu-central-1", region: "eu-central-1", workloadType: "CONTAINER", hidden: false },
8+
];
9+
10+
describe("regionForQueue", () => {
11+
it("maps a backing queue to its region", () => {
12+
expect(regionForQueue("us-east-1-next", groups)).toBe("us-east-1");
13+
});
14+
it("maps a container queue to its own region", () => {
15+
expect(regionForQueue("us-east-1", groups)).toBe("us-east-1");
16+
});
17+
it("passes an unknown queue through unchanged", () => {
18+
expect(regionForQueue("mystery", groups)).toBe("mystery");
19+
});
20+
it("passes through when a group has no region set", () => {
21+
expect(regionForQueue("x", [{ masterQueue: "x", region: null, workloadType: "CONTAINER", hidden: false }])).toBe("x");
22+
});
23+
});
24+
25+
describe("backingForQueue", () => {
26+
it("finds the MICROVM backing for a region with one", () => {
27+
expect(backingForQueue("us-east-1", groups)).toBe("us-east-1-next");
28+
});
29+
it("returns undefined for a region with no compute backing (EU)", () => {
30+
expect(backingForQueue("eu-central-1", groups)).toBeUndefined();
31+
});
32+
it("returns undefined when the queue's group has no region", () => {
33+
expect(backingForQueue("x", [{ masterQueue: "x", region: null, workloadType: "CONTAINER", hidden: false }])).toBeUndefined();
34+
});
35+
it("ignores hidden MICROVM groups", () => {
36+
const g: WorkerGroupRegionRow[] = [
37+
{ masterQueue: "us-east-1", region: "us-east-1", workloadType: "CONTAINER", hidden: false },
38+
{ masterQueue: "us-east-1-next", region: "us-east-1", workloadType: "MICROVM", hidden: true },
39+
];
40+
expect(backingForQueue("us-east-1", g)).toBeUndefined();
41+
});
42+
});
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- AlterTable
2+
ALTER TABLE "WorkerInstanceGroup" ADD COLUMN IF NOT EXISTS "region" TEXT;

internal-packages/database/prisma/schema.prisma

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1532,6 +1532,10 @@ model WorkerInstanceGroup {
15321532
15331533
workloadType WorkloadType @default(CONTAINER)
15341534
1535+
/// Geo region (e.g. "us-east-1"); container + MICROVM groups for one geo share it.
1536+
/// Set-once while the group has runs - changing it breaks region resolution for them.
1537+
region String?
1538+
15351539
/// When true, runs enqueued to this worker queue may skip the intermediate queue
15361540
/// and be pushed directly to the worker queue when concurrency is available.
15371541
enableFastPath Boolean @default(false)

0 commit comments

Comments
 (0)