mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
refactor(coderd): collapse activityBumpWorkspace into a single query (#9652)
* Adds unit-style tests for activityBumpWorkspace * Ports logic of activityBumpWorkspace to a SQL query * Updates activityBumpWorkspace to call above query
This commit is contained in:
@@ -15,6 +15,52 @@ import (
|
||||
"github.com/sqlc-dev/pqtype"
|
||||
)
|
||||
|
||||
const activityBumpWorkspace = `-- name: ActivityBumpWorkspace :exec
|
||||
WITH latest AS (
|
||||
SELECT
|
||||
workspace_builds.id::uuid AS build_id,
|
||||
workspace_builds.deadline::timestamp AS build_deadline,
|
||||
workspace_builds.max_deadline::timestamp AS build_max_deadline,
|
||||
workspace_builds.transition AS build_transition,
|
||||
provisioner_jobs.completed_at::timestamp AS job_completed_at,
|
||||
(workspaces.ttl / 1000 / 1000 / 1000 || ' seconds')::interval AS ttl_interval
|
||||
FROM workspace_builds
|
||||
JOIN provisioner_jobs
|
||||
ON provisioner_jobs.id = workspace_builds.job_id
|
||||
JOIN workspaces
|
||||
ON workspaces.id = workspace_builds.workspace_id
|
||||
WHERE workspace_builds.workspace_id = $1::uuid
|
||||
ORDER BY workspace_builds.build_number DESC
|
||||
LIMIT 1
|
||||
)
|
||||
UPDATE
|
||||
workspace_builds wb
|
||||
SET
|
||||
updated_at = NOW(),
|
||||
deadline = CASE
|
||||
WHEN l.build_max_deadline = '0001-01-01 00:00:00+00'
|
||||
THEN NOW() + l.ttl_interval
|
||||
ELSE LEAST(NOW() + l.ttl_interval, l.build_max_deadline)
|
||||
END
|
||||
FROM latest l
|
||||
WHERE wb.id = l.build_id
|
||||
AND l.job_completed_at IS NOT NULL
|
||||
AND l.build_transition = 'start'
|
||||
AND l.build_deadline != '0001-01-01 00:00:00+00'
|
||||
AND l.build_deadline - (l.ttl_interval * 0.95) < NOW()
|
||||
`
|
||||
|
||||
// We bump by the original TTL to prevent counter-intuitive behavior
|
||||
// as the TTL wraps. For example, if I set the TTL to 12 hours, sign off
|
||||
// work at midnight, come back at 10am, I would want another full day
|
||||
// of uptime.
|
||||
// We only bump if workspace shutdown is manual.
|
||||
// We only bump when 5% of the deadline has elapsed.
|
||||
func (q *sqlQuerier) ActivityBumpWorkspace(ctx context.Context, workspaceID uuid.UUID) error {
|
||||
_, err := q.db.ExecContext(ctx, activityBumpWorkspace, workspaceID)
|
||||
return err
|
||||
}
|
||||
|
||||
const deleteAPIKeyByID = `-- name: DeleteAPIKeyByID :exec
|
||||
DELETE FROM
|
||||
api_keys
|
||||
|
||||
Reference in New Issue
Block a user