Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd98e3ca

Browse files
committed
fix(database): limit GetLatestWorkspaceAppStatusByAppID to 1 row
GetLatestWorkspaceAppStatusesByAppID returned all app statuses for agiven app ID, which could be unbounded for long-running AI tasks. Onlythe most recent status was used, so we now:- Rename query to GetLatestWorkspaceAppStatusByAppID (singular)- Change query type from :many to :one- Add LIMIT 1 to SQL query- Update usages to handle single result instead of sliceFixes#20862---🤖 PR was written by Claude Sonnet 4.5 Thinking and reviewed by a human 🏄🏻‍♂️.
1 parent7fd9a45 commitd98e3ca

File tree

8 files changed

+50
-64
lines changed

8 files changed

+50
-64
lines changed

‎coderd/database/dbauthz/dbauthz.go‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1366,6 +1366,13 @@ func (q *querier) authorizeProvisionerJob(ctx context.Context, job database.Prov
13661366
returnnil
13671367
}
13681368

1369+
func (q*querier)GetLatestWorkspaceAppStatusByAppID(ctx context.Context,appID uuid.UUID) (database.WorkspaceAppStatus,error) {
1370+
iferr:=q.authorizeContext(ctx,policy.ActionRead,rbac.ResourceSystem);err!=nil {
1371+
return database.WorkspaceAppStatus{},err
1372+
}
1373+
returnq.db.GetLatestWorkspaceAppStatusByAppID(ctx,appID)
1374+
}
1375+
13691376
func (q*querier)AcquireLock(ctx context.Context,idint64)error {
13701377
returnq.db.AcquireLock(ctx,id)
13711378
}
@@ -2426,13 +2433,6 @@ func (q *querier) GetLatestCryptoKeyByFeature(ctx context.Context, feature datab
24262433
returnq.db.GetLatestCryptoKeyByFeature(ctx,feature)
24272434
}
24282435

2429-
func (q*querier)GetLatestWorkspaceAppStatusesByAppID(ctx context.Context,appID uuid.UUID) ([]database.WorkspaceAppStatus,error) {
2430-
iferr:=q.authorizeContext(ctx,policy.ActionRead,rbac.ResourceSystem);err!=nil {
2431-
returnnil,err
2432-
}
2433-
returnq.db.GetLatestWorkspaceAppStatusesByAppID(ctx,appID)
2434-
}
2435-
24362436
func (q*querier)GetLatestWorkspaceAppStatusesByWorkspaceIDs(ctx context.Context,ids []uuid.UUID) ([]database.WorkspaceAppStatus,error) {
24372437
iferr:=q.authorizeContext(ctx,policy.ActionRead,rbac.ResourceSystem);err!=nil {
24382438
returnnil,err

‎coderd/database/dbauthz/dbauthz_test.go‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2864,9 +2864,9 @@ func (s *MethodTestSuite) TestSystemFunctions() {
28642864
dbm.EXPECT().UpdateUserLinkedID(gomock.Any(),arg).Return(l,nil).AnyTimes()
28652865
check.Args(arg).Asserts(rbac.ResourceSystem,policy.ActionUpdate).Returns(l)
28662866
}))
2867-
s.Run("GetLatestWorkspaceAppStatusesByAppID",s.Mocked(func(dbm*dbmock.MockStore,_*gofakeit.Faker,check*expects) {
2867+
s.Run("GetLatestWorkspaceAppStatusByAppID",s.Mocked(func(dbm*dbmock.MockStore,_*gofakeit.Faker,check*expects) {
28682868
appID:=uuid.New()
2869-
dbm.EXPECT().GetLatestWorkspaceAppStatusesByAppID(gomock.Any(),appID).Return([]database.WorkspaceAppStatus{},nil).AnyTimes()
2869+
dbm.EXPECT().GetLatestWorkspaceAppStatusByAppID(gomock.Any(),appID).Return(database.WorkspaceAppStatus{},nil).AnyTimes()
28702870
check.Args(appID).Asserts(rbac.ResourceSystem,policy.ActionRead)
28712871
}))
28722872
s.Run("GetLatestWorkspaceAppStatusesByWorkspaceIDs",s.Mocked(func(dbm*dbmock.MockStore,_*gofakeit.Faker,check*expects) {

‎coderd/database/dbmetrics/querymetrics.go‎

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more aboutcustomizing how changed files appear on GitHub.

‎coderd/database/dbmock/dbmock.go‎

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more aboutcustomizing how changed files appear on GitHub.

‎coderd/database/querier.go‎

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more aboutcustomizing how changed files appear on GitHub.

‎coderd/database/queries.sql.go‎

Lines changed: 16 additions & 31 deletions
Some generated files are not rendered by default. Learn more aboutcustomizing how changed files appear on GitHub.

‎coderd/database/queries/workspaceapps.sql‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,12 @@ RETURNING *;
7373
-- name: GetWorkspaceAppStatusesByAppIDs :many
7474
SELECT*FROM workspace_app_statusesWHERE app_id= ANY(@ids :: uuid [ ]);
7575

76-
-- name:GetLatestWorkspaceAppStatusesByAppID :many
76+
-- name:GetLatestWorkspaceAppStatusByAppID :one
7777
SELECT*
7878
FROM workspace_app_statuses
7979
WHERE app_id= @app_id::uuid
80-
ORDER BY created_atDESC, idDESC;
80+
ORDER BY created_atDESC, idDESC
81+
LIMIT1;
8182

8283
-- name: GetLatestWorkspaceAppStatusesByWorkspaceIDs :many
8384
SELECT DISTINCTON (workspace_id)

‎coderd/workspaceagents.go‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -388,12 +388,12 @@ func (api *API) patchWorkspaceAgentAppStatus(rw http.ResponseWriter, r *http.Req
388388
// Treat the message as untrusted input.
389389
cleaned:=strutil.UISanitize(req.Message)
390390

391-
// Get the lateststatuses for the workspace app to detect no-op updates
391+
// Get the lateststatus for the workspace app to detect no-op updates
392392
// nolint:gocritic // This is a system restricted operation.
393-
latestAppStatus,err:=api.Database.GetLatestWorkspaceAppStatusesByAppID(dbauthz.AsSystemRestricted(ctx),app.ID)
394-
iferr!=nil {
393+
latestAppStatus,err:=api.Database.GetLatestWorkspaceAppStatusByAppID(dbauthz.AsSystemRestricted(ctx),app.ID)
394+
iferr!=nil&&!errors.Is(err,sql.ErrNoRows){
395395
httpapi.Write(ctx,rw,http.StatusInternalServerError, codersdk.Response{
396-
Message:"Failed to get latest workspace appstatuses.",
396+
Message:"Failed to get latest workspace appstatus.",
397397
Detail:err.Error(),
398398
})
399399
return
@@ -442,7 +442,7 @@ func (api *API) patchWorkspaceAgentAppStatus(rw http.ResponseWriter, r *http.Req
442442
func (api*API)enqueueAITaskStateNotification(
443443
ctx context.Context,
444444
appID uuid.UUID,
445-
latestAppStatus[]database.WorkspaceAppStatus,
445+
latestAppStatus database.WorkspaceAppStatus,
446446
newAppStatus codersdk.WorkspaceAppStatusState,
447447
workspace database.Workspace,
448448
agent database.WorkspaceAgent,
@@ -492,14 +492,14 @@ func (api *API) enqueueAITaskStateNotification(
492492
}
493493

494494
// Skip if the latest persisted state equals the new state (no new transition)
495-
iflen(latestAppStatus)>0&&latestAppStatus[0].State==database.WorkspaceAppStatusState(newAppStatus) {
495+
iflatestAppStatus.ID!=uuid.Nil&&latestAppStatus.State==database.WorkspaceAppStatusState(newAppStatus) {
496496
return
497497
}
498498

499499
// Skip the initial "Working" notification when task first starts.
500500
// This is obvious to the user since they just created the task.
501501
// We still notify on first "Idle" status and all subsequent transitions.
502-
iflen(latestAppStatus)==0&&newAppStatus==codersdk.WorkspaceAppStatusStateWorking {
502+
iflatestAppStatus.ID==uuid.Nil&&newAppStatus==codersdk.WorkspaceAppStatusStateWorking {
503503
return
504504
}
505505

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp