Files
qinglong/packages/ql3-local-sqlite/src/migrations/0087-run-attempt-log-retention.ts
T

80 lines
3.4 KiB
TypeScript

import { defineLocalSqliteMigration } from './sqlMigration';
export const local0087RunAttemptLogRetentionMigration =
defineLocalSqliteMigration({
id: '0087-run-attempt-log-retention',
statements: [
`
CREATE TABLE "QingLong3RunAttemptLogArtifactTombstones" (
log_artifact_id TEXT PRIMARY KEY,
project_id TEXT NOT NULL,
run_id TEXT NOT NULL,
attempt_id TEXT NOT NULL,
executor_type TEXT NOT NULL
CONSTRAINT ql3_run_log_tombstone_executor_check
CHECK (executor_type = 'local_process'),
finished_at_ms INTEGER NOT NULL,
eligible_at_ms INTEGER NOT NULL,
retired_at_ms INTEGER NOT NULL,
disposition TEXT NOT NULL
CONSTRAINT ql3_run_log_tombstone_disposition_check
CHECK (disposition IN ('deleted','already_absent')),
byte_length INTEGER NOT NULL,
truncated TEXT NOT NULL
CONSTRAINT ql3_run_log_tombstone_truncated_check
CHECK (truncated IN ('true','false','unknown')),
maximum_bytes INTEGER,
truncation_observed_at_ms INTEGER,
record_digest TEXT NOT NULL,
CONSTRAINT ql3_run_log_tombstone_identity_check CHECK (
length(project_id) BETWEEN 1 AND 128 AND
length(run_id) BETWEEN 1 AND 128 AND
length(attempt_id) BETWEEN 1 AND 128 AND
length(log_artifact_id) = 36 AND
substr(log_artifact_id, 1, 6) = 'local-' AND
substr(log_artifact_id, 7) NOT GLOB '*[^0-9a-f]*'
),
CONSTRAINT ql3_run_log_tombstone_time_check CHECK (
finished_at_ms >= 0 AND
eligible_at_ms >= finished_at_ms AND
retired_at_ms >= eligible_at_ms
),
CONSTRAINT ql3_run_log_tombstone_size_check CHECK (
byte_length BETWEEN 0 AND 1073741824 AND
(disposition <> 'already_absent' OR byte_length = 0)
),
CONSTRAINT ql3_run_log_tombstone_truncation_shape_check CHECK (
(truncated = 'unknown' AND maximum_bytes IS NULL AND truncation_observed_at_ms IS NULL) OR
(truncated IN ('true','false') AND maximum_bytes >= 1 AND truncation_observed_at_ms >= 0)
),
CONSTRAINT ql3_run_log_tombstone_digest_check CHECK (
length(record_digest) = 64 AND record_digest NOT GLOB '*[^0-9a-f]*'
),
CONSTRAINT ql3_run_log_tombstone_attempt_fk
FOREIGN KEY (attempt_id) REFERENCES "RunAttempts" (id) ON DELETE CASCADE,
CONSTRAINT ql3_run_log_tombstone_run_fk
FOREIGN KEY (run_id) REFERENCES "Runs" (id) ON DELETE CASCADE
)
`,
`CREATE INDEX ql3_run_log_tombstone_retired_idx ON "QingLong3RunAttemptLogArtifactTombstones" (retired_at_ms, attempt_id)`,
`CREATE UNIQUE INDEX ql3_run_log_tombstone_attempt_uidx ON "QingLong3RunAttemptLogArtifactTombstones" (attempt_id)`,
`CREATE INDEX ql3_run_log_retention_candidate_idx ON "RunAttempts" (executor_type, status, finished_at_ms, id) WHERE log_artifact_id IS NOT NULL`,
`
CREATE TABLE "QingLong3RunAttemptLogRetentionState" (
maintenance_id TEXT PRIMARY KEY
CONSTRAINT ql3_run_log_retention_state_id_check
CHECK (maintenance_id = 'local-run-attempt-log'),
cursor_finished_at_ms INTEGER,
cursor_attempt_id TEXT,
updated_at_ms INTEGER NOT NULL,
CONSTRAINT ql3_run_log_retention_state_cursor_check CHECK (
(cursor_finished_at_ms IS NULL AND cursor_attempt_id IS NULL) OR
(cursor_finished_at_ms >= 0 AND length(cursor_attempt_id) BETWEEN 1 AND 128)
),
CONSTRAINT ql3_run_log_retention_state_time_check CHECK (updated_at_ms >= 0)
)
`,
`INSERT INTO "QingLong3RunAttemptLogRetentionState" (maintenance_id, cursor_finished_at_ms, cursor_attempt_id, updated_at_ms) VALUES ('local-run-attempt-log', NULL, NULL, 0)`,
],
});