Skip to content

Commit 75c54db

Browse files
committed
improve query
1 parent 75118b8 commit 75c54db

File tree

5 files changed

+39
-31
lines changed

5 files changed

+39
-31
lines changed

coderd/autobuild/lifecycle_executor.go

-1
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,6 @@ func (e *Executor) runOnce(t time.Time) Stats {
184184
Time: database.Now(),
185185
Valid: true,
186186
},
187-
LockedTtlMs: templateSchedule.LockedTTL.Milliseconds(),
188187
})
189188
if err != nil {
190189
log.Error(e.ctx, "unable to lock workspace",

coderd/database/dbfake/dbfake.go

+16-4
Original file line numberDiff line numberDiff line change
@@ -4847,10 +4847,22 @@ func (q *FakeQuerier) UpdateWorkspaceLockedDeletingAt(_ context.Context, arg dat
48474847
workspace.LastUsedAt = database.Now()
48484848
workspace.DeletingAt = sql.NullTime{}
48494849
}
4850-
if arg.LockedTtlMs > 0 && !workspace.LockedAt.Time.IsZero() {
4851-
workspace.DeletingAt = sql.NullTime{
4852-
Valid: true,
4853-
Time: workspace.LockedAt.Time.Add(time.Duration(arg.LockedTtlMs) * time.Millisecond),
4850+
if !workspace.LockedAt.Time.IsZero() {
4851+
var template database.TemplateTable
4852+
for _, t := range q.templates {
4853+
if t.ID == workspace.TemplateID {
4854+
template = t
4855+
break
4856+
}
4857+
}
4858+
if template.ID == uuid.Nil {
4859+
return xerrors.Errorf("unable to find workspace template")
4860+
}
4861+
if template.LockedTTL > 0 {
4862+
workspace.DeletingAt = sql.NullTime{
4863+
Valid: true,
4864+
Time: workspace.LockedAt.Time.Add(time.Duration(template.LockedTTL)),
4865+
}
48544866
}
48554867
}
48564868
q.workspaces[index] = workspace

coderd/database/queries.sql.go

+11-7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/workspaces.sql

+8-3
Original file line numberDiff line numberDiff line change
@@ -489,17 +489,22 @@ WHERE
489489
) AND workspaces.deleted = 'false';
490490

491491
-- name: UpdateWorkspaceLockedDeletingAt :exec
492-
UPDATE workspaces
492+
UPDATE
493+
workspaces
493494
SET
494495
locked_at = $2,
495496
-- When a workspace is unlocked we want to update the last_used_at to avoid the workspace getting re-locked.
496497
-- if we're locking the workspace then we leave it alone.
497498
last_used_at = CASE WHEN $2::timestamptz IS NULL THEN now() at time zone 'utc' ELSE last_used_at END,
498499
-- If locked_at is null (meaning unlocked) or the template-defined locked_ttl is 0 we should set
499500
-- deleting_at to NULL else set it to the locked_at + locked_ttl duration.
500-
deleting_at = CASE WHEN $2::timestamptz IS NULL OR @locked_ttl_ms::bigint = 0 THEN NULL ELSE $2::timestamptz + interval '1 millisecond' * @locked_ttl_ms::bigint END
501+
deleting_at = CASE WHEN $2::timestamptz IS NULL OR templates.locked_ttl = 0 THEN NULL ELSE $2::timestamptz + INTERVAL '1 milliseconds' * templates.locked_ttl / 1000000 END
502+
FROM
503+
templates
501504
WHERE
502-
id = $1;
505+
workspaces.template_id = templates.id
506+
AND
507+
workspaces.id = $1;
503508

504509
-- name: UpdateWorkspacesDeletingAtByTemplateID :exec
505510
UPDATE

coderd/workspaces.go

+4-16
Original file line numberDiff line numberDiff line change
@@ -784,22 +784,10 @@ func (api *API) putWorkspaceLock(rw http.ResponseWriter, r *http.Request) {
784784
lockedAt.Time = database.Now()
785785
}
786786

787-
err := api.Database.InTx(func(tx database.Store) error {
788-
template, err := tx.GetTemplateByID(ctx, workspace.TemplateID)
789-
if err != nil {
790-
return xerrors.Errorf("get template by id: %w", err)
791-
}
792-
793-
err = tx.UpdateWorkspaceLockedDeletingAt(ctx, database.UpdateWorkspaceLockedDeletingAtParams{
794-
ID: workspace.ID,
795-
LockedAt: lockedAt,
796-
LockedTtlMs: time.Duration(template.LockedTTL).Milliseconds(),
797-
})
798-
if err != nil {
799-
return xerrors.Errorf("update workspace locked at: %w", err)
800-
}
801-
return nil
802-
}, nil)
787+
err := api.Database.UpdateWorkspaceLockedDeletingAt(ctx, database.UpdateWorkspaceLockedDeletingAtParams{
788+
ID: workspace.ID,
789+
LockedAt: lockedAt,
790+
})
803791
if err != nil {
804792
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
805793
Message: "Internal error updating workspace locked status.",

0 commit comments

Comments
 (0)