Skip to content

Commit b86c400

Browse files
committed
Add constraint
1 parent 7ce73aa commit b86c400

File tree

10 files changed

+125
-43
lines changed

10 files changed

+125
-43
lines changed

agent/agent.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -652,12 +652,12 @@ func (a *agent) runScript(ctx context.Context, lifecycle, script string) error {
652652
saver := &prefixsuffix.Saver{N: 512 << 10}
653653
writer := io.MultiWriter(saver, fileWriter)
654654
defer func() {
655-
err := a.client.InsertOrUpdateStartupLogs(ctx, agentsdk.InsertOrUpdateStartupLogsRequest{
656-
Output: string(saver.Bytes()),
657-
})
658-
if err != nil {
659-
a.logger.Error(ctx, "upload startup logs", slog.Error(err))
660-
}
655+
// err := a.client.AppendStartupLogs(ctx, agentsdk.InsertOrUpdateStartupLogsRequest{
656+
// Output: string(saver.Bytes()),
657+
// })
658+
// if err != nil {
659+
// a.logger.Error(ctx, "upload startup logs", slog.Error(err))
660+
// }
661661
}()
662662

663663
cmd, err := a.createCommand(ctx, script, nil)

coderd/database/dump.sql

Lines changed: 19 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/errors.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,12 @@ func IsQueryCanceledError(err error) bool {
3737

3838
return false
3939
}
40+
41+
func IsStartupLogsLimitError(err error) bool {
42+
var pqErr *pq.Error
43+
if errors.As(err, &pqErr) {
44+
return pqErr.Constraint == "max_startup_logs_length" && pqErr.Table == "workspace_agents"
45+
}
46+
47+
return false
48+
}
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
CREATE TABLE IF NOT EXISTS workspace_agent_startup_logs (
22
agent_id uuid NOT NULL REFERENCES workspace_agents (id) ON DELETE CASCADE,
3-
id bigint NOT NULL,
43
created_at timestamptz NOT NULL,
54
output varchar(1024) NOT NULL,
6-
UNIQUE(agent_id, id)
5+
id BIGSERIAL PRIMARY KEY
76
);
8-
97
CREATE INDEX workspace_agent_startup_logs_id_agent_id_idx ON workspace_agent_startup_logs USING btree (agent_id, id ASC);
8+
9+
ALTER TABLE workspace_agents ADD COLUMN startup_logs_length integer NOT NULL DEFAULT 0 CONSTRAINT max_startup_logs_length CHECK (startup_logs_length <= 1048576);
10+
COMMENT ON COLUMN workspace_agents.startup_logs_length IS 'Total length of startup logs';
11+

coderd/database/models.go

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/querier_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,40 @@ func TestGetDeploymentWorkspaceAgentStats(t *testing.T) {
8686
require.Equal(t, int64(1), stats.SessionCountVSCode)
8787
})
8888
}
89+
90+
func TestInsertWorkspaceAgentStartupLogs(t *testing.T) {
91+
t.Parallel()
92+
if testing.Short() {
93+
t.SkipNow()
94+
}
95+
sqlDB := testSQLDB(t)
96+
ctx := context.Background()
97+
err := migrations.Up(sqlDB)
98+
require.NoError(t, err)
99+
db := database.New(sqlDB)
100+
org := dbgen.Organization(t, db, database.Organization{})
101+
job := dbgen.ProvisionerJob(t, db, database.ProvisionerJob{
102+
OrganizationID: org.ID,
103+
})
104+
resource := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{
105+
JobID: job.ID,
106+
})
107+
agent := dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{
108+
ResourceID: resource.ID,
109+
})
110+
logs, err := db.InsertWorkspaceAgentStartupLogs(ctx, database.InsertWorkspaceAgentStartupLogsParams{
111+
AgentID: agent.ID,
112+
CreatedAt: []time.Time{database.Now()},
113+
Output: []string{"first"},
114+
OutputLength: 1 << 20,
115+
})
116+
require.NoError(t, err)
117+
require.Equal(t, int64(1), logs[0].ID)
118+
119+
_, err = db.InsertWorkspaceAgentStartupLogs(ctx, database.InsertWorkspaceAgentStartupLogsParams{
120+
AgentID: agent.ID,
121+
CreatedAt: []time.Time{database.Now()},
122+
Output: []string{"second"},
123+
})
124+
require.True(t, database.IsStartupLogsLimitError(err))
125+
}

coderd/database/queries.sql.go

Lines changed: 35 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/workspaceagents.sql

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,14 @@ WHERE
107107
) ORDER BY id ASC;
108108

109109
-- name: InsertWorkspaceAgentStartupLogs :many
110+
WITH new_length AS (
111+
UPDATE workspace_agents SET
112+
startup_logs_length = startup_logs_length + @output_length WHERE workspace_agents.id = @agent_id
113+
)
110114
INSERT INTO
111-
workspace_agent_startup_logs
112-
SELECT
113-
@agent_id :: uuid AS agent_id,
114-
unnest(@created_at :: timestamptz [ ]) AS created_at,
115-
unnest(@output :: VARCHAR(1024) [ ]) AS output RETURNING *;
115+
workspace_agent_startup_logs
116+
SELECT
117+
@agent_id :: uuid AS agent_id,
118+
unnest(@created_at :: timestamptz [ ]) AS created_at,
119+
unnest(@output :: VARCHAR(1024) [ ]) AS output
120+
RETURNING workspace_agent_startup_logs.*;

0 commit comments

Comments
 (0)