Skip to content

Commit 49dbc55

Browse files
committed
modify deadline measurement
1 parent 9272f4b commit 49dbc55

File tree

1 file changed

+60
-52
lines changed

1 file changed

+60
-52
lines changed

coderd/activitybump_internal_test.go

Lines changed: 60 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/coder/coder/v2/coderd/database/dbgen"
1414
"github.com/coder/coder/v2/coderd/database/dbtestutil"
1515
"github.com/coder/coder/v2/coderd/database/dbtime"
16+
"github.com/coder/coder/v2/coderd/util/ptr"
1617
"github.com/coder/coder/v2/testutil"
1718

1819
"github.com/stretchr/testify/require"
@@ -22,79 +23,80 @@ func Test_ActivityBumpWorkspace(t *testing.T) {
2223
t.Parallel()
2324

2425
for _, tt := range []struct {
25-
name string
26-
transition database.WorkspaceTransition
27-
jobCompletedAt sql.NullTime
28-
buildDeadline time.Time
29-
maxDeadline time.Time
30-
workspaceTTL time.Duration
31-
expectedBump time.Duration
26+
name string
27+
transition database.WorkspaceTransition
28+
jobCompletedAt sql.NullTime
29+
buildDeadlineOffset *time.Duration
30+
maxDeadline time.Time
31+
workspaceTTL time.Duration
32+
expectedBump time.Duration
3233
}{
3334
{
34-
name: "NotFinishedYet",
35-
transition: database.WorkspaceTransitionStart,
36-
jobCompletedAt: sql.NullTime{},
37-
buildDeadline: dbtime.Now().Add(8 * time.Hour),
38-
workspaceTTL: 8 * time.Hour,
39-
expectedBump: 0,
35+
name: "NotFinishedYet",
36+
transition: database.WorkspaceTransitionStart,
37+
jobCompletedAt: sql.NullTime{},
38+
buildDeadlineOffset: ptr.Ref(8 * time.Hour),
39+
workspaceTTL: 8 * time.Hour,
40+
expectedBump: 0,
4041
},
4142
{
42-
name: "ManualShutdown",
43-
transition: database.WorkspaceTransitionStart,
44-
jobCompletedAt: sql.NullTime{Valid: true, Time: dbtime.Now()},
45-
buildDeadline: time.Time{},
46-
expectedBump: 0,
43+
name: "ManualShutdown",
44+
transition: database.WorkspaceTransitionStart,
45+
jobCompletedAt: sql.NullTime{Valid: true, Time: dbtime.Now()},
46+
buildDeadlineOffset: nil,
47+
expectedBump: 0,
4748
},
4849
{
49-
name: "NotTimeToBumpYet",
50-
transition: database.WorkspaceTransitionStart,
51-
jobCompletedAt: sql.NullTime{Valid: true, Time: dbtime.Now()},
52-
buildDeadline: dbtime.Now().Add(8 * time.Hour),
53-
workspaceTTL: 8 * time.Hour,
54-
expectedBump: 0,
50+
name: "NotTimeToBumpYet",
51+
transition: database.WorkspaceTransitionStart,
52+
jobCompletedAt: sql.NullTime{Valid: true, Time: dbtime.Now()},
53+
buildDeadlineOffset: ptr.Ref(8 * time.Hour),
54+
workspaceTTL: 8 * time.Hour,
55+
expectedBump: 0,
5556
},
5657
{
57-
name: "TimeToBump",
58-
transition: database.WorkspaceTransitionStart,
59-
jobCompletedAt: sql.NullTime{Valid: true, Time: dbtime.Now().Add(-24 * time.Minute)},
60-
buildDeadline: dbtime.Now().Add(8*time.Hour - 24*time.Minute),
61-
workspaceTTL: 8 * time.Hour,
62-
expectedBump: 8 * time.Hour,
58+
name: "TimeToBump",
59+
transition: database.WorkspaceTransitionStart,
60+
jobCompletedAt: sql.NullTime{Valid: true, Time: dbtime.Now().Add(-24 * time.Minute)},
61+
buildDeadlineOffset: ptr.Ref(8*time.Hour - 24*time.Minute),
62+
workspaceTTL: 8 * time.Hour,
63+
expectedBump: 8 * time.Hour,
6364
},
6465
{
65-
name: "MaxDeadline",
66-
transition: database.WorkspaceTransitionStart,
67-
jobCompletedAt: sql.NullTime{Valid: true, Time: dbtime.Now().Add(-24 * time.Minute)},
68-
buildDeadline: dbtime.Now().Add(time.Minute), // last chance to bump!
69-
maxDeadline: dbtime.Now().Add(time.Hour),
70-
workspaceTTL: 8 * time.Hour,
71-
expectedBump: 1 * time.Hour,
66+
name: "MaxDeadline",
67+
transition: database.WorkspaceTransitionStart,
68+
jobCompletedAt: sql.NullTime{Valid: true, Time: dbtime.Now().Add(-24 * time.Minute)},
69+
buildDeadlineOffset: ptr.Ref(time.Minute), // last chance to bump!
70+
maxDeadline: dbtime.Now().Add(time.Hour),
71+
workspaceTTL: 8 * time.Hour,
72+
expectedBump: 1 * time.Hour,
7273
},
7374
{
7475
// A workspace that is still running, has passed its deadline, but has not
7576
// yet been auto-stopped should still bump the deadline.
76-
name: "PastDeadlineStillBumps",
77-
transition: database.WorkspaceTransitionStart,
78-
jobCompletedAt: sql.NullTime{Valid: true, Time: dbtime.Now().Add(-24 * time.Minute)},
79-
buildDeadline: dbtime.Now().Add(-time.Minute),
80-
workspaceTTL: 8 * time.Hour,
81-
expectedBump: 8 * time.Hour,
77+
name: "PastDeadlineStillBumps",
78+
transition: database.WorkspaceTransitionStart,
79+
jobCompletedAt: sql.NullTime{Valid: true, Time: dbtime.Now().Add(-24 * time.Minute)},
80+
buildDeadlineOffset: ptr.Ref(-time.Minute),
81+
workspaceTTL: 8 * time.Hour,
82+
expectedBump: 8 * time.Hour,
8283
},
8384
{
8485
// A stopped workspace should never bump.
85-
name: "StoppedWorkspace",
86-
transition: database.WorkspaceTransitionStop,
87-
jobCompletedAt: sql.NullTime{Valid: true, Time: dbtime.Now().Add(-time.Minute)},
88-
buildDeadline: dbtime.Now().Add(-time.Minute),
89-
workspaceTTL: 8 * time.Hour,
90-
expectedBump: 0,
86+
name: "StoppedWorkspace",
87+
transition: database.WorkspaceTransitionStop,
88+
jobCompletedAt: sql.NullTime{Valid: true, Time: dbtime.Now().Add(-time.Minute)},
89+
buildDeadlineOffset: ptr.Ref(-time.Minute),
90+
workspaceTTL: 8 * time.Hour,
91+
expectedBump: 0,
9192
},
9293
} {
9394
tt := tt
9495
t.Run(tt.name, func(t *testing.T) {
9596
t.Parallel()
9697

9798
var (
99+
now = dbtime.Now()
98100
ctx = testutil.Context(t, testutil.WaitShort)
99101
log = slogtest.Make(t, nil)
100102
db, _ = dbtestutil.NewDB(t)
@@ -141,6 +143,10 @@ func Test_ActivityBumpWorkspace(t *testing.T) {
141143
}
142144

143145
// dbgen.WorkspaceBuild automatically sets deadline to now+1 hour if not set
146+
var buildDeadline time.Time
147+
if tt.buildDeadlineOffset != nil {
148+
buildDeadline = now.Add(*tt.buildDeadlineOffset)
149+
}
144150
err := db.InsertWorkspaceBuild(ctx, database.InsertWorkspaceBuildParams{
145151
ID: buildID,
146152
CreatedAt: dbtime.Now(),
@@ -152,7 +158,7 @@ func Test_ActivityBumpWorkspace(t *testing.T) {
152158
JobID: job.ID,
153159
TemplateVersionID: templateVersion.ID,
154160
Transition: tt.transition,
155-
Deadline: tt.buildDeadline,
161+
Deadline: buildDeadline,
156162
MaxDeadline: tt.maxDeadline,
157163
})
158164
require.NoError(t, err, "unexpected error inserting workspace build")
@@ -162,19 +168,21 @@ func Test_ActivityBumpWorkspace(t *testing.T) {
162168
// Validate our initial state before bump
163169
require.Equal(t, tt.transition, bld.Transition, "unexpected transition before bump")
164170
require.Equal(t, tt.jobCompletedAt.Time.UTC(), job.CompletedAt.Time.UTC(), "unexpected job completed at before bump")
165-
require.Equal(t, tt.buildDeadline.UTC(), bld.Deadline.UTC(), "unexpected build deadline before bump")
171+
require.Equal(t, buildDeadline.UTC(), bld.Deadline.UTC(), "unexpected build deadline before bump")
166172
require.Equal(t, tt.maxDeadline.UTC(), bld.MaxDeadline.UTC(), "unexpected max deadline before bump")
167173
require.Equal(t, tt.workspaceTTL, time.Duration(ws.Ttl.Int64), "unexpected workspace TTL before bump")
168174

169175
workaroundWindowsTimeResolution(t)
170176

177+
// Bump duration is measured from the time of the bump, so we measure from here.
171178
start := dbtime.Now()
172179
activityBumpWorkspace(ctx, log, db, bld.WorkspaceID)
173180
elapsed := time.Since(start)
174181
if elapsed > 15*time.Second {
175182
t.Logf("warning: activityBumpWorkspace took longer than 15 seconds: %s", elapsed)
176183
}
177-
// Guessing at the approximate time of the bump here, if it happened.
184+
// The actual bump could have happened anywhere in the elapsed time, so we
185+
// guess at the approximate time of the bump.
178186
approxBumpTime := start.Add(elapsed / 2)
179187

180188
// Validate our state after bump

0 commit comments

Comments
 (0)