@@ -36,7 +36,7 @@ FROM templates t
36
36
WHERE (t .id = sqlc .narg (' template_id' )::uuid OR sqlc .narg (' template_id' ) IS NULL );
37
37
38
38
-- name: GetPrebuildsInProgress :many
39
- SELECT t .id AS template_id, wpb .template_version_id , wpb .transition , COUNT (wpb .transition ) AS count
39
+ SELECT t .id AS template_id, wpb .template_version_id , wpb .transition , COUNT (wpb .transition ):: int AS count
40
40
FROM workspace_latest_build wlb
41
41
INNER JOIN provisioner_jobs pj ON wlb .job_id = pj .id
42
42
INNER JOIN workspace_prebuild_builds wpb ON wpb .id = wlb .id
@@ -46,36 +46,37 @@ GROUP BY t.id, wpb.template_version_id, wpb.transition;
46
46
47
47
-- name: GetPresetsBackoff :many
48
48
WITH filtered_builds AS (
49
- -- Only select builds which are for prebuild creations
50
- SELECT wlb.* , tvp .id AS preset_id, pj .job_status
51
- FROM template_version_presets tvp
52
- JOIN workspace_latest_build wlb ON wlb .template_version_preset_id = tvp .id
53
- JOIN provisioner_jobs pj ON wlb .job_id = pj .id
54
- JOIN template_versions tv ON wlb .template_version_id = tv .id
55
- JOIN templates t ON tv .template_id = t .id AND t .active_version_id = tv .id
56
- JOIN template_version_preset_prebuilds tvpp ON tvpp .preset_id = tvp .id
57
- WHERE wlb .transition = ' start' ::workspace_transition),
58
- latest_builds AS (
59
- -- Select only the latest build per template_version AND preset
60
- SELECT fb.* ,
61
- ROW_NUMBER() OVER (PARTITION BY fb .template_version_preset_id ORDER BY fb .created_at DESC ) as rn
62
- FROM filtered_builds fb),
63
- failed_count AS (
64
- -- Count failed builds per template version/preset in the given period
65
- SELECT preset_id, COUNT (* ) AS num_failed
66
- FROM filtered_builds
67
- WHERE job_status = ' failed' ::provisioner_job_status
68
- AND created_at >= @lookback::timestamptz
69
- GROUP BY preset_id)
49
+ -- Only select builds which are for prebuild creations
50
+ SELECT wlb.* , tvp .id AS preset_id, pj .job_status , tvpp . desired_instances
51
+ FROM template_version_presets tvp
52
+ JOIN workspace_latest_build wlb ON wlb .template_version_preset_id = tvp .id
53
+ JOIN provisioner_jobs pj ON wlb .job_id = pj .id
54
+ JOIN template_versions tv ON wlb .template_version_id = tv .id
55
+ JOIN templates t ON tv .template_id = t .id AND t .active_version_id = tv .id
56
+ JOIN template_version_preset_prebuilds tvpp ON tvpp .preset_id = tvp .id
57
+ WHERE wlb .transition = ' start' ::workspace_transition),
58
+ latest_builds AS (
59
+ -- Select only the latest build per template_version AND preset
60
+ SELECT fb.* ,
61
+ ROW_NUMBER() OVER (PARTITION BY fb .template_version_preset_id ORDER BY fb .created_at DESC ) as rn
62
+ FROM filtered_builds fb),
63
+ failed_count AS (
64
+ -- Count failed builds per template version/preset in the given period
65
+ SELECT preset_id, COUNT (* ) AS num_failed
66
+ FROM filtered_builds
67
+ WHERE job_status = ' failed' ::provisioner_job_status
68
+ AND created_at >= @lookback::timestamptz
69
+ GROUP BY preset_id)
70
70
SELECT lb .template_version_id ,
71
- lb .preset_id ,
72
- lb .job_status AS latest_build_status,
73
- COALESCE(fc .num_failed , 0 )::int AS num_failed,
74
- lb .created_at AS last_build_at
71
+ lb .preset_id ,
72
+ MAX ( lb .job_status )::provisioner_job_status AS latest_build_status,
73
+ MAX ( COALESCE(fc .num_failed , 0 )) ::int AS num_failed,
74
+ MAX ( lb .created_at ):: timestamptz AS last_build_at
75
75
FROM latest_builds lb
76
- LEFT JOIN failed_count fc ON fc .preset_id = lb .preset_id
77
- WHERE lb .rn = 1
78
- AND lb .job_status = ' failed' ::provisioner_job_status;
76
+ LEFT JOIN failed_count fc ON fc .preset_id = lb .preset_id
77
+ WHERE lb .rn <= lb .desired_instances -- Fetch the last N builds, where N is the number of desired instances; if any fail, we backoff
78
+ AND lb .job_status = ' failed' ::provisioner_job_status
79
+ GROUP BY lb .template_version_id , lb .preset_id , lb .job_status ;
79
80
80
81
-- name: ClaimPrebuild :one
81
82
-- TODO: rewrite to use named CTE instead?
0 commit comments