Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f2fe379

Browse files
fix: make GetWorkspacesEligibleForTransition return less false-positives (#15429)
Relates to #15082 The old implementation of `GetWorkspacesEligibleForTransition` returns many workspaces that are not actually eligible for transition. This new implementation reduces this number significantly (at least on our dogfood instance).
1 parent fa69d1c commit f2fe379

File tree

7 files changed

+210
-116
lines changed

7 files changed

+210
-116
lines changed

coderd/database/dbauthz/dbauthz.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -2803,7 +2803,7 @@ func (q *querier) GetWorkspacesAndAgentsByOwnerID(ctx context.Context, ownerID u
28032803
return q.db.GetAuthorizedWorkspacesAndAgentsByOwnerID(ctx, ownerID, prep)
28042804
}
28052805

2806-
func (q *querier) GetWorkspacesEligibleForTransition(ctx context.Context, now time.Time) ([]database.WorkspaceTable, error) {
2806+
func (q *querier) GetWorkspacesEligibleForTransition(ctx context.Context, now time.Time) ([]database.GetWorkspacesEligibleForTransitionRow, error) {
28072807
return q.db.GetWorkspacesEligibleForTransition(ctx, now)
28082808
}
28092809

coderd/database/dbmem/dbmem.go

+68-29
Original file line numberDiff line numberDiff line change
@@ -6868,60 +6868,99 @@ func (q *FakeQuerier) GetWorkspacesAndAgentsByOwnerID(ctx context.Context, owner
68686868
return q.GetAuthorizedWorkspacesAndAgentsByOwnerID(ctx, ownerID, nil)
68696869
}
68706870

6871-
func (q *FakeQuerier) GetWorkspacesEligibleForTransition(ctx context.Context, now time.Time) ([]database.WorkspaceTable, error) {
6871+
func (q *FakeQuerier) GetWorkspacesEligibleForTransition(ctx context.Context, now time.Time) ([]database.GetWorkspacesEligibleForTransitionRow, error) {
68726872
q.mutex.RLock()
68736873
defer q.mutex.RUnlock()
68746874

6875-
workspaces := []database.WorkspaceTable{}
6875+
workspaces := []database.GetWorkspacesEligibleForTransitionRow{}
68766876
for _, workspace := range q.workspaces {
68776877
build, err := q.getLatestWorkspaceBuildByWorkspaceIDNoLock(ctx, workspace.ID)
68786878
if err != nil {
6879-
return nil, err
6880-
}
6881-
6882-
if build.Transition == database.WorkspaceTransitionStart &&
6883-
!build.Deadline.IsZero() &&
6884-
build.Deadline.Before(now) &&
6885-
!workspace.DormantAt.Valid {
6886-
workspaces = append(workspaces, workspace)
6887-
continue
6879+
return nil, xerrors.Errorf("get workspace build by ID: %w", err)
68886880
}
68896881

6890-
if build.Transition == database.WorkspaceTransitionStop &&
6891-
workspace.AutostartSchedule.Valid &&
6892-
!workspace.DormantAt.Valid {
6893-
workspaces = append(workspaces, workspace)
6894-
continue
6882+
user, err := q.getUserByIDNoLock(workspace.OwnerID)
6883+
if err != nil {
6884+
return nil, xerrors.Errorf("get user by ID: %w", err)
68956885
}
68966886

68976887
job, err := q.getProvisionerJobByIDNoLock(ctx, build.JobID)
68986888
if err != nil {
68996889
return nil, xerrors.Errorf("get provisioner job by ID: %w", err)
69006890
}
6901-
if codersdk.ProvisionerJobStatus(job.JobStatus) == codersdk.ProvisionerJobFailed {
6902-
workspaces = append(workspaces, workspace)
6903-
continue
6904-
}
69056891

69066892
template, err := q.getTemplateByIDNoLock(ctx, workspace.TemplateID)
69076893
if err != nil {
69086894
return nil, xerrors.Errorf("get template by ID: %w", err)
69096895
}
6910-
if !workspace.DormantAt.Valid && template.TimeTilDormant > 0 {
6911-
workspaces = append(workspaces, workspace)
6896+
6897+
if workspace.Deleted {
69126898
continue
69136899
}
6914-
if workspace.DormantAt.Valid && template.TimeTilDormantAutoDelete > 0 {
6915-
workspaces = append(workspaces, workspace)
6900+
6901+
if job.JobStatus != database.ProvisionerJobStatusFailed &&
6902+
!workspace.DormantAt.Valid &&
6903+
build.Transition == database.WorkspaceTransitionStart &&
6904+
(user.Status == database.UserStatusSuspended || (!build.Deadline.IsZero() && build.Deadline.Before(now))) {
6905+
workspaces = append(workspaces, database.GetWorkspacesEligibleForTransitionRow{
6906+
ID: workspace.ID,
6907+
Name: workspace.Name,
6908+
})
69166909
continue
69176910
}
69186911

6919-
user, err := q.getUserByIDNoLock(workspace.OwnerID)
6920-
if err != nil {
6921-
return nil, xerrors.Errorf("get user by ID: %w", err)
6912+
if user.Status == database.UserStatusActive &&
6913+
job.JobStatus != database.ProvisionerJobStatusFailed &&
6914+
build.Transition == database.WorkspaceTransitionStop &&
6915+
workspace.AutostartSchedule.Valid {
6916+
workspaces = append(workspaces, database.GetWorkspacesEligibleForTransitionRow{
6917+
ID: workspace.ID,
6918+
Name: workspace.Name,
6919+
})
6920+
continue
69226921
}
6923-
if user.Status == database.UserStatusSuspended && build.Transition == database.WorkspaceTransitionStart {
6924-
workspaces = append(workspaces, workspace)
6922+
6923+
if !workspace.DormantAt.Valid &&
6924+
template.TimeTilDormant > 0 &&
6925+
now.Sub(workspace.LastUsedAt) > time.Duration(template.TimeTilDormant) {
6926+
workspaces = append(workspaces, database.GetWorkspacesEligibleForTransitionRow{
6927+
ID: workspace.ID,
6928+
Name: workspace.Name,
6929+
})
6930+
continue
6931+
}
6932+
6933+
if workspace.DormantAt.Valid &&
6934+
workspace.DeletingAt.Valid &&
6935+
workspace.DeletingAt.Time.Before(now) &&
6936+
template.TimeTilDormantAutoDelete > 0 {
6937+
if build.Transition == database.WorkspaceTransitionDelete &&
6938+
job.JobStatus == database.ProvisionerJobStatusFailed {
6939+
if job.CanceledAt.Valid && now.Sub(job.CanceledAt.Time) <= 24*time.Hour {
6940+
continue
6941+
}
6942+
6943+
if job.CompletedAt.Valid && now.Sub(job.CompletedAt.Time) <= 24*time.Hour {
6944+
continue
6945+
}
6946+
}
6947+
6948+
workspaces = append(workspaces, database.GetWorkspacesEligibleForTransitionRow{
6949+
ID: workspace.ID,
6950+
Name: workspace.Name,
6951+
})
6952+
continue
6953+
}
6954+
6955+
if template.FailureTTL > 0 &&
6956+
build.Transition == database.WorkspaceTransitionStart &&
6957+
job.JobStatus == database.ProvisionerJobStatusFailed &&
6958+
job.CompletedAt.Valid &&
6959+
now.Sub(job.CompletedAt.Time) > time.Duration(template.FailureTTL) {
6960+
workspaces = append(workspaces, database.GetWorkspacesEligibleForTransitionRow{
6961+
ID: workspace.ID,
6962+
Name: workspace.Name,
6963+
})
69256964
continue
69266965
}
69276966
}

coderd/database/dbmetrics/querymetrics.go

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

coderd/database/dbmock/dbmock.go

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

coderd/database/querier.go

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

coderd/database/queries.sql.go

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

0 commit comments

Comments
 (0)