@@ -2,16 +2,13 @@ package coderd
2
2
3
3
import (
4
4
"context"
5
- "database/sql"
6
- "errors"
7
5
"time"
8
6
9
7
"github.com/google/uuid"
10
8
"golang.org/x/xerrors"
11
9
12
10
"cdr.dev/slog"
13
11
"github.com/coder/coder/v2/coderd/database"
14
- "github.com/coder/coder/v2/coderd/database/dbtime"
15
12
)
16
13
17
14
// activityBumpWorkspace automatically bumps the workspace's auto-off timer
@@ -21,81 +18,7 @@ func activityBumpWorkspace(ctx context.Context, log slog.Logger, db database.Sto
21
18
// low priority operations fail first.
22
19
ctx , cancel := context .WithTimeout (ctx , time .Second * 15 )
23
20
defer cancel ()
24
- // if err := db.ActivityBumpWorkspace(ctx, workspaceID); err != nil {
25
- // if !xerrors.Is(err, context.Canceled) && !database.IsQueryCanceledError(err) {
26
- // // Bump will fail if the context is canceled, but this is ok.
27
- // log.Error(ctx, "bump failed", slog.Error(err),
28
- // slog.F("workspace_id", workspaceID),
29
- // )
30
- // }
31
- // return
32
- // }
33
-
34
- err := db .InTx (func (s database.Store ) error {
35
- build , err := s .GetLatestWorkspaceBuildByWorkspaceID (ctx , workspaceID )
36
- if errors .Is (err , sql .ErrNoRows ) {
37
- return nil
38
- } else if err != nil {
39
- return xerrors .Errorf ("get latest workspace build: %w" , err )
40
- }
41
-
42
- job , err := s .GetProvisionerJobByID (ctx , build .JobID )
43
- if err != nil {
44
- return xerrors .Errorf ("get provisioner job: %w" , err )
45
- }
46
-
47
- if build .Transition != database .WorkspaceTransitionStart || ! job .CompletedAt .Valid {
48
- return nil
49
- }
50
-
51
- if build .Deadline .IsZero () {
52
- // Workspace shutdown is manual
53
- return nil
54
- }
55
-
56
- workspace , err := s .GetWorkspaceByID (ctx , workspaceID )
57
- if err != nil {
58
- return xerrors .Errorf ("get workspace: %w" , err )
59
- }
60
-
61
- var (
62
- // We bump by the original TTL to prevent counter-intuitive behavior
63
- // as the TTL wraps. For example, if I set the TTL to 12 hours, sign off
64
- // work at midnight, come back at 10am, I would want another full day
65
- // of uptime. In the prior implementation, the workspace would enter
66
- // a state of always expiring 1 hour in the future
67
- bumpAmount = time .Duration (workspace .Ttl .Int64 )
68
- // DB writes are expensive so we only bump when 5% of the deadline
69
- // has elapsed.
70
- bumpEvery = bumpAmount / 20
71
- timeSinceLastBump = bumpAmount - time .Until (build .Deadline )
72
- )
73
-
74
- if timeSinceLastBump < bumpEvery {
75
- return nil
76
- }
77
-
78
- if bumpAmount == 0 {
79
- return nil
80
- }
81
-
82
- newDeadline := dbtime .Now ().Add (bumpAmount )
83
- if ! build .MaxDeadline .IsZero () && newDeadline .After (build .MaxDeadline ) {
84
- newDeadline = build .MaxDeadline
85
- }
86
-
87
- if err := s .UpdateWorkspaceBuildByID (ctx , database.UpdateWorkspaceBuildByIDParams {
88
- ID : build .ID ,
89
- UpdatedAt : dbtime .Now (),
90
- ProvisionerState : build .ProvisionerState ,
91
- Deadline : newDeadline ,
92
- MaxDeadline : build .MaxDeadline ,
93
- }); err != nil {
94
- return xerrors .Errorf ("update workspace build: %w" , err )
95
- }
96
- return nil
97
- }, nil )
98
- if err != nil {
21
+ if err := db .ActivityBumpWorkspace (ctx , workspaceID ); err != nil {
99
22
if ! xerrors .Is (err , context .Canceled ) && ! database .IsQueryCanceledError (err ) {
100
23
// Bump will fail if the context is canceled, but this is ok.
101
24
log .Error (ctx , "bump failed" , slog .Error (err ),
0 commit comments