Skip to content

Commit 8653a33

Browse files
committed
refactor: add lifecycle fields to prebuild claim database query
1 parent c42ef24 commit 8653a33

File tree

7 files changed

+69
-34
lines changed

7 files changed

+69
-34
lines changed

coderd/database/dbgen/dbgen.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1438,9 +1438,12 @@ func UserSecret(t testing.TB, db database.Store, seed database.UserSecret) datab
14381438

14391439
func ClaimPrebuild(t testing.TB, db database.Store, newUserID uuid.UUID, newName string, presetID uuid.UUID) database.ClaimPrebuiltWorkspaceRow {
14401440
claimedWorkspace, err := db.ClaimPrebuiltWorkspace(genCtx, database.ClaimPrebuiltWorkspaceParams{
1441-
NewUserID: newUserID,
1442-
NewName: newName,
1443-
PresetID: presetID,
1441+
NewUserID: newUserID,
1442+
NewName: newName,
1443+
PresetID: presetID,
1444+
AutostartSchedule: sql.NullString{},
1445+
NextStartAt: sql.NullTime{},
1446+
WorkspaceTtl: sql.NullInt64{},
14441447
})
14451448
require.NoError(t, err, "claim prebuilt workspace")
14461449

coderd/database/queries.sql.go

Lines changed: 20 additions & 5 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: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ UPDATE workspaces w
33
SET owner_id = @new_user_id::uuid,
44
name = @new_name::text,
55
updated_at = NOW(),
6+
-- Update autostart_schedule, next_start_at and ttl according to template and workspace-level
7+
-- configurations, allowing the workspace to be managed by the lifecycle executor as expected.
8+
autostart_schedule = @autostart_schedule,
9+
next_start_at = @next_start_at,
10+
ttl = @workspace_ttl,
611
-- Update last_used_at during claim to ensure the claimed workspace is treated as recently used.
712
-- This avoids unintended dormancy caused by prebuilds having stale usage timestamps.
813
last_used_at = NOW(),

coderd/prebuilds/api.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package prebuilds
22

33
import (
44
"context"
5+
"database/sql"
56

67
"github.com/google/uuid"
78
"golang.org/x/xerrors"
@@ -54,6 +55,14 @@ type StateSnapshotter interface {
5455
}
5556

5657
type Claimer interface {
57-
Claim(ctx context.Context, userID uuid.UUID, name string, presetID uuid.UUID) (*uuid.UUID, error)
58+
Claim(
59+
ctx context.Context,
60+
userID uuid.UUID,
61+
name string,
62+
presetID uuid.UUID,
63+
autostartSchedule sql.NullString,
64+
nextStartAt sql.NullTime,
65+
ttl sql.NullInt64,
66+
) (*uuid.UUID, error)
5867
Initiator() uuid.UUID
5968
}

coderd/prebuilds/noop.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package prebuilds
22

33
import (
44
"context"
5+
"database/sql"
56

67
"github.com/google/uuid"
78

@@ -28,7 +29,7 @@ var DefaultReconciler ReconciliationOrchestrator = NoopReconciler{}
2829

2930
type NoopClaimer struct{}
3031

31-
func (NoopClaimer) Claim(context.Context, uuid.UUID, string, uuid.UUID) (*uuid.UUID, error) {
32+
func (NoopClaimer) Claim(context.Context, uuid.UUID, string, uuid.UUID, sql.NullString, sql.NullTime, sql.NullInt64) (*uuid.UUID, error) {
3233
// Not entitled to claim prebuilds in AGPL version.
3334
return nil, ErrAGPLDoesNotSupportPrebuiltWorkspaces
3435
}

coderd/workspaces.go

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -638,7 +638,11 @@ func createWorkspace(
638638
// If a template preset was chosen, try claim a prebuilt workspace.
639639
if req.TemplateVersionPresetID != uuid.Nil {
640640
// Try and claim an eligible prebuild, if available.
641-
claimedWorkspace, err = claimPrebuild(ctx, prebuildsClaimer, db, api.Logger, req, owner)
641+
// On successful claim, initialize all lifecycle fields from template and workspace-level config
642+
// so the newly claimed workspace is properly managed by the lifecycle executor.
643+
claimedWorkspace, err = claimPrebuild(
644+
ctx, prebuildsClaimer, db, api.Logger, req, owner,
645+
dbAutostartSchedule, nextStartAt, dbTTL)
642646
// If claiming fails with an expected error (no claimable prebuilds or AGPL does not support prebuilds),
643647
// we fall back to creating a new workspace. Otherwise, propagate the unexpected error.
644648
if err != nil {
@@ -690,24 +694,7 @@ func createWorkspace(
690694
}
691695
workspaceID = minimumWorkspace.ID
692696
} else {
693-
// Prebuild found! Update lifecycle related parameters
694-
err = db.UpdateWorkspaceAutostart(ctx, database.UpdateWorkspaceAutostartParams{
695-
ID: claimedWorkspace.ID,
696-
AutostartSchedule: dbAutostartSchedule,
697-
NextStartAt: nextStartAt,
698-
})
699-
if err != nil {
700-
return xerrors.Errorf("update claimed workspace Autostart: %w", err)
701-
}
702-
703-
err = db.UpdateWorkspaceTTL(ctx, database.UpdateWorkspaceTTLParams{
704-
ID: claimedWorkspace.ID,
705-
Ttl: dbTTL,
706-
})
707-
if err != nil {
708-
return xerrors.Errorf("update claimed workspace TTL: %w", err)
709-
}
710-
697+
// Prebuild found!
711698
workspaceID = claimedWorkspace.ID
712699
initiatorID = prebuildsClaimer.Initiator()
713700
}
@@ -890,8 +877,17 @@ func requestTemplate(ctx context.Context, rw http.ResponseWriter, req codersdk.C
890877
return template, true
891878
}
892879

893-
func claimPrebuild(ctx context.Context, claimer prebuilds.Claimer, db database.Store, logger slog.Logger, req codersdk.CreateWorkspaceRequest, owner workspaceOwner) (*database.Workspace, error) {
894-
claimedID, err := claimer.Claim(ctx, owner.ID, req.Name, req.TemplateVersionPresetID)
880+
func claimPrebuild(
881+
ctx context.Context,
882+
claimer prebuilds.Claimer,
883+
db database.Store, logger slog.Logger,
884+
req codersdk.CreateWorkspaceRequest,
885+
owner workspaceOwner,
886+
autostartSchedule sql.NullString,
887+
nextStartAt sql.NullTime,
888+
ttl sql.NullInt64,
889+
) (*database.Workspace, error) {
890+
claimedID, err := claimer.Claim(ctx, owner.ID, req.Name, req.TemplateVersionPresetID, autostartSchedule, nextStartAt, ttl)
895891
if err != nil {
896892
// TODO: enhance this by clarifying whether this *specific* prebuild failed or whether there are none to claim.
897893
return nil, xerrors.Errorf("claim prebuild: %w", err)

enterprise/coderd/prebuilds/claim.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,17 @@ func (c EnterpriseClaimer) Claim(
2727
userID uuid.UUID,
2828
name string,
2929
presetID uuid.UUID,
30+
autostartSchedule sql.NullString,
31+
nextStartAt sql.NullTime,
32+
ttl sql.NullInt64,
3033
) (*uuid.UUID, error) {
3134
result, err := c.store.ClaimPrebuiltWorkspace(ctx, database.ClaimPrebuiltWorkspaceParams{
32-
NewUserID: userID,
33-
NewName: name,
34-
PresetID: presetID,
35+
NewUserID: userID,
36+
NewName: name,
37+
PresetID: presetID,
38+
AutostartSchedule: autostartSchedule,
39+
NextStartAt: nextStartAt,
40+
WorkspaceTtl: ttl,
3541
})
3642
if err != nil {
3743
switch {

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy