mirror of
https://github.com/coder/coder.git
synced 2026-09-22 21:22:17 +08:00
Add a periodic purge job for `boundary_logs` rows past their retention threshold, following the same pattern as the existing audit log and connection log purge jobs in `dbpurge`. Expose a `--boundary-log-retention` deployment flag (env `CODER_BOUNDARY_LOG_RETENTION`, YAML `retention.boundary_logs`). Default is `0` (keep indefinitely). When set to a positive duration, `purgeTick` deletes rows where `captured_at` is older than the threshold in batches of 10,000, matching other log purge operations. The `boundary_logs` label is added to the `records_purged_total` Prometheus counter. Also removes the random-UUID fallback for `OwnerID` in `dbgen.BoundarySession`. The previous fallback generated a UUID that could never satisfy the `boundary_sessions_owner_id_fkey` FK constraint, masking test setup bugs. Callers must now provide a valid user ID or accept NULL (the legitimate "user deleted" state).
97 lines
2.5 KiB
SQL
97 lines
2.5 KiB
SQL
-- name: InsertBoundarySession :one
|
|
INSERT INTO boundary_sessions (
|
|
id,
|
|
workspace_agent_id,
|
|
owner_id,
|
|
confined_process_name,
|
|
started_at,
|
|
updated_at
|
|
) VALUES (
|
|
@id,
|
|
@workspace_agent_id,
|
|
@owner_id,
|
|
@confined_process_name,
|
|
@started_at,
|
|
@updated_at
|
|
) RETURNING *;
|
|
|
|
-- name: GetBoundarySessionByID :one
|
|
SELECT * FROM boundary_sessions WHERE id = @id;
|
|
|
|
-- name: InsertBoundaryLogs :many
|
|
INSERT INTO boundary_logs (
|
|
id,
|
|
session_id,
|
|
sequence_number,
|
|
captured_at,
|
|
created_at,
|
|
proto,
|
|
method,
|
|
detail,
|
|
matched_rule
|
|
)
|
|
SELECT
|
|
unnest(@id :: uuid[]),
|
|
@session_id :: uuid,
|
|
unnest(@sequence_number :: int[]),
|
|
unnest(@captured_at :: timestamptz[]),
|
|
unnest(@created_at :: timestamptz[]),
|
|
unnest(@proto :: text[]),
|
|
unnest(@method :: text[]),
|
|
unnest(@detail :: text[]),
|
|
NULLIF(unnest(@matched_rule :: text[]), '')
|
|
RETURNING *;
|
|
|
|
-- name: GetBoundaryLogByID :one
|
|
SELECT * FROM boundary_logs WHERE id = @id;
|
|
|
|
-- name: ListBoundaryLogsBySessionID :many
|
|
-- Lists boundary logs for a session, sorted by sequence number ascending.
|
|
-- Supports optional exclusive sequence number bounds (seq_after, seq_before)
|
|
-- for fetching events between two known interceptions.
|
|
SELECT *
|
|
FROM boundary_logs
|
|
WHERE
|
|
session_id = @session_id
|
|
AND CASE
|
|
WHEN sqlc.narg('seq_after')::int IS NOT NULL THEN sequence_number > sqlc.narg('seq_after')
|
|
ELSE true
|
|
END
|
|
AND CASE
|
|
WHEN sqlc.narg('seq_before')::int IS NOT NULL THEN sequence_number < sqlc.narg('seq_before')
|
|
ELSE true
|
|
END
|
|
ORDER BY sequence_number ASC
|
|
LIMIT COALESCE(NULLIF(@limit_opt::int, 0), 100);
|
|
|
|
-- name: DeleteOldBoundaryLogs :execrows
|
|
-- Deletes boundary logs older than the given time, bounded by a row limit
|
|
-- to avoid long-running transactions.
|
|
WITH old_logs AS (
|
|
SELECT id
|
|
FROM boundary_logs
|
|
WHERE captured_at < @before_time::timestamptz
|
|
ORDER BY captured_at ASC
|
|
LIMIT @limit_count
|
|
)
|
|
DELETE FROM boundary_logs
|
|
USING old_logs
|
|
WHERE boundary_logs.id = old_logs.id;
|
|
|
|
-- name: DeleteOldBoundarySessions :execrows
|
|
-- Deletes boundary sessions that have aged past retention and no longer
|
|
-- have any associated logs.
|
|
WITH old_sessions AS (
|
|
SELECT bs.id
|
|
FROM boundary_sessions bs
|
|
WHERE bs.updated_at < @before_time::timestamptz
|
|
AND NOT EXISTS (
|
|
SELECT 1 FROM boundary_logs bl WHERE bl.session_id = bs.id
|
|
)
|
|
ORDER BY bs.updated_at ASC
|
|
LIMIT @limit_count
|
|
)
|
|
DELETE FROM boundary_sessions
|
|
USING old_sessions
|
|
WHERE boundary_sessions.id = old_sessions.id;
|