Skip to content

Commit 0286ddf

Browse files
committed
fix(run-engine,webapp,clickhouse): review fixes for the metrics tier
The plain dequeue gauge re-samples after admissions like the keyed one, the repair path clears a keyed run's variant and group slots by concurrency key, pause responses include the combined limit, stale wording and a leftover changeset from before the rename are cleaned up, and two empty flag blocks are removed from the fast-path scripts.
1 parent 2040512 commit 0286ddf

5 files changed

Lines changed: 32 additions & 14 deletions

File tree

apps/webapp/app/v3/querySchemas.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1426,7 +1426,7 @@ const queueMetricsByKeySchema: TableSchema = {
14261426
name: "max_limit",
14271427
...column("UInt32", {
14281428
description:
1429-
"The queue concurrency limit that applied to this key in the bucket. Aggregate with max().",
1429+
"The queue concurrency limit that applied to this key in the bucket (1000000 = no explicit limit). Aggregate with max().",
14301430
fillMode: "carry",
14311431
}),
14321432
},

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ export class PauseQueueService extends BaseService {
9292
concurrencyLimitOverriddenAt: updatedQueue.concurrencyLimitOverriddenAt ?? null,
9393
concurrencyLimitOverriddenBy: queue.concurrencyLimitOverriddenBy ?? null,
9494
paused: updatedQueue.paused,
95+
totalConcurrencyLimit: updatedQueue.totalConcurrencyLimit ?? null,
96+
totalConcurrencyLimitBase: updatedQueue.totalConcurrencyLimitBase ?? null,
97+
totalConcurrencyLimitOverriddenAt: updatedQueue.totalConcurrencyLimitOverriddenAt ?? null,
9598
}),
9699
};
97100
} catch (error) {

internal-packages/clickhouse/schema/042_add_queue_metrics_combined_concurrency.sql

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
-- Total-concurrency gauges: combined_running is the in-flight count across ALL
44
-- concurrency-key variants of a queue (the groupConcurrency set), combined_limit the
55
-- RAW stored total cap (0 = none, readers clamp against max_env_limit). Emitted on
6-
-- base-queue gauge rows only. Per-key gauge rows now carry the EFFECTIVE per-key
7-
-- limit in queue_limit, surfaced in the ck tier as max_limit.
6+
-- base-queue gauge rows only. Per-key gauge rows carry the queue concurrency
7+
-- limit that applied in queue_limit, surfaced in the ck tier as max_limit
8+
-- (1000000 = no explicit limit).
89

910
ALTER TABLE trigger_dev.queue_metrics_raw_v1
1011
ADD COLUMN IF NOT EXISTS combined_running UInt32 DEFAULT 0,

internal-packages/run-engine/src/engine/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2993,6 +2993,7 @@ export class RunEngine {
29932993
{
29942994
select: {
29952995
queue: true,
2996+
concurrencyKey: true,
29962997
},
29972998
},
29982999
this.prisma
@@ -3014,6 +3015,7 @@ export class RunEngine {
30143015
runId,
30153016
orgId: latestSnapshot.organizationId,
30163017
queue: taskRun.queue,
3018+
concurrencyKey: taskRun.concurrencyKey ?? undefined,
30173019
env: {
30183020
id: latestSnapshot.environmentId,
30193021
type: latestSnapshot.environmentType,

internal-packages/run-engine/src/run-queue/index.ts

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,6 @@ export type RunQueueOptions = {
323323
* the total cap covering releases from builds without the mirror.
324324
*/
325325
gatesEnabled?: boolean;
326-
/** Cap on per-concurrency-key limit overrides stored per queue. Default 1000. */
327326
workerOptions?: {
328327
pollIntervalMs?: number;
329328
immediatePollIntervalMs?: number;
@@ -1529,6 +1528,7 @@ export class RunQueue {
15291528
runId: string;
15301529
orgId: string;
15311530
queue: string;
1531+
concurrencyKey?: string;
15321532
env: RunQueueKeyProducerEnvironment;
15331533
}) {
15341534
return this.#callClearMessageFromConcurrencySets(params);
@@ -3060,18 +3060,30 @@ export class RunQueue {
30603060
runId,
30613061
orgId,
30623062
queue,
3063+
concurrencyKey,
30633064
env,
30643065
}: {
30653066
runId: string;
30663067
orgId: string;
30673068
queue: string;
3069+
concurrencyKey?: string;
30683070
env: RunQueueKeyProducerEnvironment;
30693071
}) {
30703072
const messageId = runId;
30713073
const messageKey = this.keys.messageKey(orgId, messageId);
3072-
const queueCurrentConcurrencyKey = this.keys.queueCurrentConcurrencyKey(env, queue);
3074+
/**
3075+
* Callers pass the bare TaskRun queue name plus its concurrencyKey; the run's
3076+
* slots live on the ck variant, and the tracked clear additionally mirrors the
3077+
* group set and counters that only keyed queues maintain.
3078+
*/
3079+
const fullQueue = concurrencyKey ? this.keys.queueKey(env, queue, concurrencyKey) : queue;
3080+
const queueCurrentConcurrencyKey = this.keys.queueCurrentConcurrencyKey(
3081+
env,
3082+
queue,
3083+
concurrencyKey
3084+
);
30733085
const envCurrentConcurrencyKey = this.keys.envCurrentConcurrencyKey(env);
3074-
const queueCurrentDequeuedKey = this.keys.queueCurrentDequeuedKey(env, queue);
3086+
const queueCurrentDequeuedKey = this.keys.queueCurrentDequeuedKey(env, queue, concurrencyKey);
30753087
const envCurrentDequeuedKey = this.keys.envCurrentDequeuedKey(env);
30763088

30773089
this.logger.debug("Calling clearMessageFromConcurrencySets", {
@@ -3086,15 +3098,15 @@ export class RunQueue {
30863098
service: this.name,
30873099
});
30883100

3089-
if (queue.includes(":ck:")) {
3101+
if (fullQueue.includes(":ck:")) {
30903102
return this.redis.clearMessageFromConcurrencySetsTracked(
30913103
queueCurrentConcurrencyKey,
30923104
envCurrentConcurrencyKey,
30933105
queueCurrentDequeuedKey,
30943106
envCurrentDequeuedKey,
3095-
this.keys.queueRunningCounterKeyFromQueue(queue),
3096-
this.keys.ckIndexKeyFromQueue(queue),
3097-
this.keys.queueGroupConcurrencyKeyFromQueue(queue),
3107+
this.keys.queueRunningCounterKeyFromQueue(fullQueue),
3108+
this.keys.ckIndexKeyFromQueue(fullQueue),
3109+
this.keys.queueGroupConcurrencyKeyFromQueue(fullQueue),
30983110
messageKey,
30993111
messageId,
31003112
this.options.redis.keyPrefix ?? "",
@@ -4119,8 +4131,6 @@ if enableFastPath == '1' then
41194131
tonumber(redis.call('GET', queueConcurrencyLimitKey) or '1000000'),
41204132
envLimit
41214133
)
4122-
if totalConcurrencyEnabled then
4123-
end
41244134
41254135
if queueCurrent < queueLimit then
41264136
-- Total-cap gate: a fast-path admit consumes a group slot, so it must
@@ -4294,8 +4304,6 @@ if enableFastPath == '1' then
42944304
tonumber(redis.call('GET', queueConcurrencyLimitKey) or '1000000'),
42954305
envLimit
42964306
)
4297-
if totalConcurrencyEnabled then
4298-
end
42994307
43004308
if queueCurrent < queueLimit then
43014309
-- Total-cap gate: see enqueueMessageCkTracked.
@@ -4761,6 +4769,10 @@ else
47614769
redis.call('ZADD', masterQueueKey, earliestMessage[2], queueName)
47624770
end
47634771
4772+
-- Re-sample the gauge so the emitted snapshot includes this batch's admissions;
4773+
-- the top-of-script sample only covers the early returns where nothing was admitted.
4774+
${QUEUE_METRICS_GAUGE_LUA}
4775+
47644776
-- Return results as a flat array: [messageId1, messageScore1, messagePayload1, messageId2, messageScore2, messagePayload2, ...]
47654777
return __qmret(results)
47664778
`,

0 commit comments

Comments
 (0)