From 2495bf022bf48a17ac05369c64f2048ff69775d9 Mon Sep 17 00:00:00 2001 From: Debian Date: Fri, 26 Jun 2026 11:30:12 +0200 Subject: [PATCH] =?UTF-8?q?fix(scheduler):=20Audit-Cleanup=20lief=20nie=20?= =?UTF-8?q?(int-als-text=20Encode-Fehler)=20=E2=80=94=20v1.3.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der tägliche audit_log-Cleanup (cmd/edgeguard-scheduler) schlug auf beiden Nodes jeden Tag fehl: "audit cleanup failed" keep_days=90 error: unable to encode 90 into text format for text (OID 25): cannot find encode plan Ursache: audit.go nutzte `($1::text || ' days')::interval`, übergab keepDays aber als int → pgx kann int nicht als text (OID 25) encoden. Folge: Cleanup lief nie, tägliches WARN-Rauschen + langfristig unbegrenztes audit_log-Wachstum (Einträge >keep_days wurden nie gelöscht). Fix: `NOW() - make_interval(days => $1)` — $1 bleibt sauber int-typisiert. Gegen Live-DB validiert (gültige Syntax, 0 betroffene Rows aktuell). Co-Authored-By: Claude Opus 4.8 (1M context) --- VERSION | 2 +- internal/services/audit/audit.go | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 802f957..589268e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.109 \ No newline at end of file +1.3.0 \ No newline at end of file diff --git a/internal/services/audit/audit.go b/internal/services/audit/audit.go index 38785f4..bb35558 100644 --- a/internal/services/audit/audit.go +++ b/internal/services/audit/audit.go @@ -258,9 +258,13 @@ func (r *Repo) Cleanup(ctx context.Context, keepDays int) (int64, error) { if r == nil || r.Pool == nil || keepDays <= 0 { return 0, nil } + // make_interval(days => $1) nimmt $1 als int — sauber typisiert. Der frühere + // ($1::text || ' days')::interval-Ansatz scheiterte, weil keepDays als int + // übergeben wird und pgx int nicht als text (OID 25) encoden kann + // ("cannot find encode plan") → Cleanup lief nie. tag, err := r.Pool.Exec(ctx, ` DELETE FROM audit_log -WHERE created_at < NOW() - ($1::text || ' days')::interval`, keepDays) +WHERE created_at < NOW() - make_interval(days => $1)`, keepDays) if err != nil { return 0, err }