mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
refactor(coderd): collapse activityBumpWorkspace into a single query (#9652)
* Adds unit-style tests for activityBumpWorkspace * Ports logic of activityBumpWorkspace to a SQL query * Updates activityBumpWorkspace to call above query
This commit is contained in:
@@ -685,6 +685,13 @@ func (q *FakeQuerier) GetActiveDBCryptKeys(_ context.Context) ([]database.DBCryp
|
||||
return ks, nil
|
||||
}
|
||||
|
||||
func minTime(t, u time.Time) time.Time {
|
||||
if t.Before(u) {
|
||||
return t
|
||||
}
|
||||
return u
|
||||
}
|
||||
|
||||
func (*FakeQuerier) AcquireLock(_ context.Context, _ int64) error {
|
||||
return xerrors.New("AcquireLock must only be called within a transaction")
|
||||
}
|
||||
@@ -744,6 +751,67 @@ func (q *FakeQuerier) AcquireProvisionerJob(_ context.Context, arg database.Acqu
|
||||
return database.ProvisionerJob{}, sql.ErrNoRows
|
||||
}
|
||||
|
||||
func (q *FakeQuerier) ActivityBumpWorkspace(ctx context.Context, workspaceID uuid.UUID) error {
|
||||
err := validateDatabaseType(workspaceID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
q.mutex.Lock()
|
||||
defer q.mutex.Unlock()
|
||||
|
||||
workspace, err := q.getWorkspaceByIDNoLock(ctx, workspaceID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
latestBuild, err := q.getLatestWorkspaceBuildByWorkspaceIDNoLock(ctx, workspaceID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
now := dbtime.Now()
|
||||
for i := range q.workspaceBuilds {
|
||||
if q.workspaceBuilds[i].BuildNumber != latestBuild.BuildNumber {
|
||||
continue
|
||||
}
|
||||
// If the build is not active, do not bump.
|
||||
if q.workspaceBuilds[i].Transition != database.WorkspaceTransitionStart {
|
||||
return nil
|
||||
}
|
||||
// If the provisioner job is not completed, do not bump.
|
||||
pj, err := q.getProvisionerJobByIDNoLock(ctx, q.workspaceBuilds[i].JobID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !pj.CompletedAt.Valid {
|
||||
return nil
|
||||
}
|
||||
// Do not bump if the deadline is not set.
|
||||
if q.workspaceBuilds[i].Deadline.IsZero() {
|
||||
return nil
|
||||
}
|
||||
// Only bump if 5% of the deadline has passed.
|
||||
ttlDur := time.Duration(workspace.Ttl.Int64)
|
||||
ttlDur95 := ttlDur - (ttlDur / 20)
|
||||
minBumpDeadline := q.workspaceBuilds[i].Deadline.Add(-ttlDur95)
|
||||
if now.Before(minBumpDeadline) {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Bump.
|
||||
newDeadline := now.Add(ttlDur)
|
||||
q.workspaceBuilds[i].UpdatedAt = now
|
||||
if !q.workspaceBuilds[i].MaxDeadline.IsZero() {
|
||||
q.workspaceBuilds[i].Deadline = minTime(newDeadline, q.workspaceBuilds[i].MaxDeadline)
|
||||
} else {
|
||||
q.workspaceBuilds[i].Deadline = newDeadline
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
return sql.ErrNoRows
|
||||
}
|
||||
|
||||
func (*FakeQuerier) CleanTailnetCoordinators(_ context.Context) error {
|
||||
return ErrUnimplemented
|
||||
}
|
||||
@@ -4741,6 +4809,7 @@ func (q *FakeQuerier) InsertWorkspaceBuild(_ context.Context, arg database.Inser
|
||||
JobID: arg.JobID,
|
||||
ProvisionerState: arg.ProvisionerState,
|
||||
Deadline: arg.Deadline,
|
||||
MaxDeadline: arg.MaxDeadline,
|
||||
Reason: arg.Reason,
|
||||
}
|
||||
q.workspaceBuilds = append(q.workspaceBuilds, workspaceBuild)
|
||||
|
||||
Reference in New Issue
Block a user