|
38 | 38 | );
|
39 | 39 |
|
40 | 40 | -- name: GetWorkspaces :many
|
41 |
| -WITH workspace_builds_agents AS ( |
42 |
| - SELECT |
43 |
| - workspace_builds.workspace_id AS workspace_id, |
44 |
| - workspace_builds.build_number AS build_number, |
45 |
| - workspace_agents.id AS agent_id, |
46 |
| - ( |
47 |
| - CASE |
48 |
| - WHEN workspace_agents.first_connected_at IS NULL THEN |
49 |
| - CASE |
50 |
| - WHEN workspace_agents.connection_timeout_seconds > 0 AND NOW() - workspace_agents.created_at > workspace_agents.connection_timeout_seconds * INTERVAL '1 second' THEN |
51 |
| - 'timeout' |
52 |
| - ELSE |
53 |
| - 'connecting' |
54 |
| - END |
55 |
| - WHEN workspace_agents.disconnected_at > workspace_agents.last_connected_at THEN |
56 |
| - 'disconnected' |
57 |
| - WHEN NOW() - workspace_agents.last_connected_at > INTERVAL '1 second' * @agent_inactive_disconnect_timeout_seconds :: bigint THEN |
58 |
| - 'disconnected' |
59 |
| - WHEN workspace_agents.last_connected_at IS NOT NULL THEN |
60 |
| - 'connected' |
61 |
| - ELSE |
62 |
| - NULL |
63 |
| - END |
64 |
| - ) AS agent_status |
65 |
| - FROM |
66 |
| - workspace_builds |
67 |
| - JOIN |
68 |
| - provisioner_jobs |
69 |
| - ON |
70 |
| - provisioner_jobs.id = workspace_builds.job_id |
71 |
| - JOIN |
72 |
| - workspace_resources |
73 |
| - ON |
74 |
| - workspace_resources.job_id = provisioner_jobs.id |
75 |
| - JOIN |
76 |
| - workspace_agents |
77 |
| - ON |
78 |
| - workspace_agents.resource_id = workspace_resources.id |
79 |
| - WHERE |
80 |
| - workspace_builds.transition = 'start'::workspace_transition |
81 |
| -) |
82 | 41 | SELECT
|
83 | 42 | workspaces.*, COUNT(*) OVER () as count
|
84 | 43 | FROM
|
@@ -208,11 +167,44 @@ WHERE
|
208 | 167 | AND CASE
|
209 | 168 | WHEN @has_agent :: text != '' THEN
|
210 | 169 | (
|
211 |
| - SELECT COUNT(*) FROM workspace_builds_agents |
| 170 | + SELECT COUNT(*) |
| 171 | + FROM |
| 172 | + workspace_builds |
| 173 | + JOIN |
| 174 | + provisioner_jobs |
| 175 | + ON |
| 176 | + provisioner_jobs.id = workspace_builds.job_id |
| 177 | + JOIN |
| 178 | + workspace_resources |
| 179 | + ON |
| 180 | + workspace_resources.job_id = provisioner_jobs.id |
| 181 | + JOIN |
| 182 | + workspace_agents |
| 183 | + ON |
| 184 | + workspace_agents.resource_id = workspace_resources.id |
212 | 185 | WHERE
|
213 |
| - workspace_builds_agents.workspace_id = workspaces.id AND |
214 |
| - workspace_builds_agents.build_number = latest_build.build_number AND |
215 |
| - agent_status = @has_agent |
| 186 | + workspace_builds.workspace_id = workspaces.id AND |
| 187 | + workspace_builds.build_number = latest_build.build_number AND |
| 188 | + workspace_builds.transition = 'start'::workspace_transition AND |
| 189 | + @has_agent = ( |
| 190 | + CASE |
| 191 | + WHEN workspace_agents.first_connected_at IS NULL THEN |
| 192 | + CASE |
| 193 | + WHEN workspace_agents.connection_timeout_seconds > 0 AND NOW() - workspace_agents.created_at > workspace_agents.connection_timeout_seconds * INTERVAL '1 second' THEN |
| 194 | + 'timeout' |
| 195 | + ELSE |
| 196 | + 'connecting' |
| 197 | + END |
| 198 | + WHEN workspace_agents.disconnected_at > workspace_agents.last_connected_at THEN |
| 199 | + 'disconnected' |
| 200 | + WHEN NOW() - workspace_agents.last_connected_at > INTERVAL '1 second' * @agent_inactive_disconnect_timeout_seconds :: bigint THEN |
| 201 | + 'disconnected' |
| 202 | + WHEN workspace_agents.last_connected_at IS NOT NULL THEN |
| 203 | + 'connected' |
| 204 | + ELSE |
| 205 | + NULL |
| 206 | + END |
| 207 | + ) |
216 | 208 | ) > 0
|
217 | 209 | ELSE true
|
218 | 210 | END
|
|
0 commit comments