8000 Implement strict prebuilds eligibility · coder/coder@9dd9fed · GitHub
[go: up one dir, main page]

Skip to content

Commit 9dd9fed

Browse files
committed
Implement strict prebuilds eligibility
See coder/internal#372 Signed-off-by: Danny Kopping <danny@coder.com>
1 parent e9fdd86 commit 9dd9fed

File tree

6 files changed

+159
-75
lines changed

6 files changed

+159
-75
lines changed

coderd/database/dump.sql

Lines changed: 95 additions & 39 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/migrations/000294_prebuilds.up.sql

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,18 @@ VALUES ('c42fdf75-3097-471c-8c33-fb52454d81c0', 'prebuilds@system', 'prebuilds',
44
'active', '{}', 'none', true);
55

66
-- TODO: do we *want* to use the default org here? how do we handle multi-org?
7-
WITH default_org AS (
8-
SELECT id FROM organizations WHERE is_default = true LIMIT 1
9-
)
10-
INSERT INTO organization_members (organization_id, user_id, created_at, updated_at)
11-
SELECT
12-
default_org.id,
13-
'c42fdf75-3097-471c-8c33-fb52454d81c0',
14-
NOW(),
15-
NOW()
7+
WITH default_org AS (SELECT id
8+
FROM organizations
9+
WHERE is_default = true
10+
LIMIT 1)
11+
INSERT
12+
INTO organization_members (organization_id, user_id, created_at, updated_at)
13+
SELECT default_org.id,
14+
'c42fdf75-3097-471c-8c33-fb52454d81c0',
15+
NOW(),
16+
NOW()
1617
FROM default_org;
1718

18-
CREATE VIEW workspace_prebuilds AS
19-
SELECT *
20-
FROM workspaces
21-
WHERE owner_id = 'c42fdf75-3097-471c-8c33-fb52454d81c0';
22-
23-
CREATE VIEW workspace_prebuild_builds AS
24-
SELECT *
25-
FROM workspace_builds
26-
WHERE initiator_id = 'c42fdf75-3097-471c-8c33-fb52454d81c0';
27-
2819
CREATE VIEW workspace_latest_build AS
2920
SELECT wb.*
3021
FROM (SELECT tv.template_id,
@@ -38,3 +29,22 @@ FROM (SELECT tv.template_id,
3829
AND wb.build_number = wbmax.max_build_number
3930
);
4031

32+
CREATE VIEW workspace_prebuilds AS
33+
WITH all_prebuilds AS (SELECT w.*
34+
FROM workspaces w
35+
WHERE w.owner_id = 'c42fdf75-3097-471c-8c33-fb52454d81c0'),
36+
workspace_agents AS (SELECT w.id AS workspace_id, wa.id AS agent_id, wa.lifecycle_state, wa.ready_at
37+
FROM workspaces w
38+
INNER JOIN workspace_latest_build wlb ON wlb.workspace_id = w.id
39+
INNER JOIN workspace_resources wr ON wr.job_id = wlb.job_id
40+
INNER JOIN workspace_agents wa ON wa.resource_id = wr.id
41+
WHERE w.owner_id = 'c42fdf75-3097-471c-8c33-fb52454d81c0'
42+
GROUP BY w.id, wa.id)
43+
SELECT p.*, a.agent_id, a.lifecycle_state, a.ready_at
44+
FROM all_prebuilds p
45+
LEFT JOIN workspace_agents a ON a.workspace_id = p.id;
46+
47+
CREATE VIEW workspace_prebuild_builds AS
48+
SELECT *
49+
FROM workspace_builds
50+
WHERE initiator_id = 'c42fdf75-3097-471c-8c33-fb52454d81c0';

coderd/database/models.go

Lines changed: 19 additions & 16 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries.sql.go

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/prebuilds.sql

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ WITH
66
tvp_curr.id AS current_preset_id,
77
tvp_desired.id AS desired_preset_id,
88
COUNT(*) AS count,
9+
SUM(CASE
10+
WHEN p.lifecycle_state = 'ready'::workspace_agent_lifecycle_state THEN 1
11+
ELSE 0 END) AS eligible,
912
STRING_AGG(p.id::text, ',') AS ids
1013
FROM workspace_prebuilds p
1114
INNER JOIN workspace_latest_build b ON b.workspace_id = p.id
@@ -56,6 +59,8 @@ SELECT t.template_id,
5659
ELSE '' END)::text AS running_prebuild_ids,
5760
COALESCE(MAX(CASE WHEN t.using_active_version THEN p.count ELSE 0 END),
5861
0)::int AS actual, -- running prebuilds for active version
62+
COALESCE(MAX(CASE WHEN t.using_active_version THEN p.eligible ELSE 0 END),
63+
0)::int AS eligible, -- prebuilds which can be claimed
5964
MAX(CASE WHEN t.using_active_version THEN t.desired_instances ELSE 0 END)::int AS desired, -- we only care about the active version's desired instances
6065
COALESCE(MAX(CASE
6166
WHEN p.template_version_id = t.template_version_id AND
@@ -106,6 +111,7 @@ WHERE w.id IN (SELECT p.id
106111
AND pj.job_status IN ('succeeded'::provisioner_job_status))
107112
AND b.template_version_id = t.active_version_id
108113
AND b.template_version_preset_id = @preset_id::uuid
114+
AND p.lifecycle_state = 'ready'::workspace_agent_lifecycle_state
109115
ORDER BY random()
110116
LIMIT 1 FOR UPDATE OF p SKIP LOCKED)
111117
RETURNING w.id, w.name;

enterprise/coderd/prebuilds/controller.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,8 @@ func (c *Controller) reconcileTemplate(ctx context.Context, template database.Te
328328
slog.F("to_create", len(actions.createID 6A5A s)), slog.F("to_delete", len(actions.deleteIDs)),
329329
slog.F("desired", actions.meta.Desired), slog.F("actual", actions.meta.Actual),
330330
slog.F("outdated", actions.meta.Outdated), slog.F("extraneous", actions.meta.Extraneous),
331-
slog.F("starting", actions.meta.Starting), slog.F("stopping", actions.meta.Stopping), slog.F("deleting", actions.meta.Deleting))
331+
slog.F("starting", actions.meta.Starting), slog.F("stopping", actions.meta.Stopping),
332+
slog.F("deleting", actions.meta.Deleting), slog.F("eligible", actions.meta.Eligible))
332333

333334
// Provision workspaces within the same tx so we don't get any timing issues here.
334335
// i.e. we hold the advisory lock until all reconciliatory actions have been taken.

0 commit comments

Comments
 (0)
0