@@ -6876,66 +6876,87 @@ func (q *FakeQuerier) GetWorkspacesEligibleForTransition(ctx context.Context, no
6876
6876
for _ , workspace := range q .workspaces {
6877
6877
build , err := q .getLatestWorkspaceBuildByWorkspaceIDNoLock (ctx , workspace .ID )
6878
6878
if err != nil {
6879
- return nil , err
6879
+ return nil , xerrors . Errorf ( "get workspace build by ID: %w" , err )
6880
6880
}
6881
6881
6882
- if build .Transition == database .WorkspaceTransitionStart &&
6883
- ! build .Deadline .IsZero () &&
6884
- build .Deadline .Before (now ) &&
6885
- ! workspace .DormantAt .Valid {
6886
- workspaces = append (workspaces , database.GetWorkspacesEligibleForTransitionRow {
6887
- ID : workspace .ID ,
6888
- Name : workspace .Name ,
6889
- })
6882
+ user , err := q .getUserByIDNoLock (workspace .OwnerID )
6883
+ if err != nil {
6884
+ return nil , xerrors .Errorf ("get user by ID: %w" , err )
6885
+ }
6886
+
6887
+ job , err := q .getProvisionerJobByIDNoLock (ctx , build .JobID )
6888
+ if err != nil {
6889
+ return nil , xerrors .Errorf ("get provisioner job by ID: %w" , err )
6890
+ }
6891
+
6892
+ template , err := q .getTemplateByIDNoLock (ctx , workspace .TemplateID )
6893
+ if err != nil {
6894
+ return nil , xerrors .Errorf ("get template by ID: %w" , err )
6895
+ }
6896
+
6897
+ if workspace .Deleted {
6890
6898
continue
6891
6899
}
6892
6900
6893
- if build .Transition == database .WorkspaceTransitionStop &&
6894
- workspace .AutostartSchedule .Valid &&
6895
- ! workspace .DormantAt .Valid {
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 ))) {
6896
6905
workspaces = append (workspaces , database.GetWorkspacesEligibleForTransitionRow {
6897
6906
ID : workspace .ID ,
6898
6907
Name : workspace .Name ,
6899
6908
})
6900
6909
continue
6901
6910
}
6902
6911
6903
- job , err := q .getProvisionerJobByIDNoLock (ctx , build .JobID )
6904
- if err != nil {
6905
- return nil , xerrors .Errorf ("get provisioner job by ID: %w" , err )
6906
- }
6907
- if codersdk .ProvisionerJobStatus (job .JobStatus ) == codersdk .ProvisionerJobFailed {
6912
+ if user .Status == database .UserStatusActive &&
6913
+ job .JobStatus != database .ProvisionerJobStatusFailed &&
6914
+ build .Transition == database .WorkspaceTransitionStop &&
6915
+ workspace .AutostartSchedule .Valid {
6908
6916
workspaces = append (workspaces , database.GetWorkspacesEligibleForTransitionRow {
6909
6917
ID : workspace .ID ,
6910
6918
Name : workspace .Name ,
6911
6919
})
6912
6920
continue
6913
6921
}
6914
6922
6915
- template , err := q .getTemplateByIDNoLock (ctx , workspace .TemplateID )
6916
- if err != nil {
6917
- return nil , xerrors .Errorf ("get template by ID: %w" , err )
6918
- }
6919
- if ! workspace .DormantAt .Valid && template .TimeTilDormant > 0 {
6923
+ if ! workspace .DormantAt .Valid &&
6924
+ template .TimeTilDormant > 0 &&
6925
+ now .Sub (workspace .LastUsedAt ) > time .Duration (template .TimeTilDormant ) {
6920
6926
workspaces = append (workspaces , database.GetWorkspacesEligibleForTransitionRow {
6921
6927
ID : workspace .ID ,
6922
6928
Name : workspace .Name ,
6923
6929
})
6924
6930
continue
6925
6931
}
6926
- if workspace .DormantAt .Valid && template .TimeTilDormantAutoDelete > 0 {
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
+
6927
6948
workspaces = append (workspaces , database.GetWorkspacesEligibleForTransitionRow {
6928
6949
ID : workspace .ID ,
6929
6950
Name : workspace .Name ,
6930
6951
})
6931
6952
continue
6932
6953
}
6933
6954
6934
- user , err := q . getUserByIDNoLock ( workspace . OwnerID )
6935
- if err != nil {
6936
- return nil , xerrors . Errorf ( "get user by ID: %w" , err )
6937
- }
6938
- if user . Status == database . UserStatusSuspended && build . Transition == database . WorkspaceTransitionStart {
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 ) {
6939
6960
workspaces = append (workspaces , database.GetWorkspacesEligibleForTransitionRow {
6940
6961
ID : workspace .ID ,
6941
6962
Name : workspace .Name ,
0 commit comments