fix(api): dead-letter retired worker task types (#2323)

This commit is contained in:
Hampus authored and GitHub committed 2026-09-01 20:47:19 +02:00
1 parent bc40073a02
commit aa267b54ec
8 files changed
+337 -5

No files matched your search

@@ -5,6 +5,7 @@ import type {APIWorkerLaneName, APIWorkerMode} from '../config/APIConfig';
interface LaneSettings {
readonly consumerName: string;
readonly tasks: ReadonlyArray<string>;
readonly retiredTasks: ReadonlyArray<string>;
readonly concurrency: number;
readonly maxAckPending: number;
readonly ackWaitMs: number;
@@ -15,6 +16,7 @@ const LANE_CONFIG = {
realtime: {
consumerName: 'workers_realtime',
tasks: ['handleMentions', 'handleMentionChunk'] as const,
retiredTasks: [],
concurrency: 10,
maxAckPending: 50,
ackWaitMs: 15000,
@@ -23,6 +25,7 @@ const LANE_CONFIG = {
unfurl: {
consumerName: 'workers_unfurl',
tasks: ['extractEmbeds'] as const,
retiredTasks: [],
concurrency: 20,
maxAckPending: 200,
ackWaitMs: 30000,
@@ -54,6 +57,7 @@ const LANE_CONFIG = {
'bulkAddGuildMembers',
'bulkBanFileShas',
] as const,
retiredTasks: ['sendScheduledMessage'],
concurrency: 8,
maxAckPending: 50,
ackWaitMs: 60000,
@@ -79,6 +83,7 @@ const LANE_CONFIG = {
'syncFileShaBlocklists',
'flushUserActivityBuffer',
] as const,
retiredTasks: [],
concurrency: 12,
maxAckPending: 100,
ackWaitMs: 120000,
@@ -92,6 +97,7 @@ interface WorkerLaneDefinition {
name: APIWorkerLaneName;
consumerName: string;
taskTypes: ReadonlyArray<WorkerTaskName>;
retiredTaskTypes: ReadonlyArray<string>;
concurrency: number;
maxAckPending: number;
ackWaitMs: number;
@@ -111,6 +117,7 @@ function makeLane(name: APIWorkerLaneName): WorkerLaneDefinition {
name,
consumerName: config.consumerName,
taskTypes: config.tasks,
retiredTaskTypes: config.retiredTasks,
concurrency: config.concurrency,
maxAckPending: config.maxAckPending,
ackWaitMs: config.ackWaitMs,
@@ -160,6 +167,7 @@ function resolveSingleTaskLane(taskName: WorkerTaskName | undefined): WorkerLane
name: parentLane.name,
consumerName: `worker_${taskName}`,
taskTypes: [taskName],
retiredTaskTypes: [],
concurrency: parentLane.concurrency,
maxAckPending: parentLane.maxAckPending,
ackWaitMs: parentLane.ackWaitMs,
@@ -231,6 +239,12 @@ function validateLaneCompleteness(registeredTasks: Record<string, unknown>): voi
if (missingFromRegistry.length > 0) {
errors.push(`Lane tasks not found in registry: ${missingFromRegistry.join(', ')}`);
}
const retiredCollisions = WORKER_LANES.flatMap<string>((lane) => [...lane.retiredTaskTypes]).filter((task) =>
registeredTaskNames.has(task),
);
if (retiredCollisions.length > 0) {
errors.push(`Retired tasks registered again: ${retiredCollisions.join(', ')}`);
}
if (errors.length > 0) {
throw new Error(`Worker lane configuration mismatch:\n${errors.join('\n')}`);
}