From 34ac9287b45772b283891966ab17b3233e78f295 Mon Sep 17 00:00:00 2001 From: Nathan Coad Date: Wed, 11 Feb 2026 11:04:19 +1100 Subject: [PATCH] fix sql timeout --- db/helpers.go | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/db/helpers.go b/db/helpers.go index 4e8cb30..9614ca8 100644 --- a/db/helpers.go +++ b/db/helpers.go @@ -97,11 +97,19 @@ func execLog(ctx context.Context, dbConn *sqlx.DB, query string, args ...interfa res, err := dbConn.ExecContext(ctx, query, args...) if err != nil { q := strings.TrimSpace(query) + const maxQueryLogChars = 240 + truncated := false + if len(q) > maxQueryLogChars { + q = q[:maxQueryLogChars] + " ... [truncated]" + truncated = true + } msg := strings.ToLower(err.Error()) if strings.Contains(msg, "duplicate column name") || strings.Contains(msg, "already exists") { - slog.Debug("db exec skipped (already exists)", "query", q, "error", err) + slog.Debug("db exec skipped (already exists)", "query", q, "query_truncated", truncated, "error", err) + } else if errors.Is(err, context.DeadlineExceeded) || errors.Is(err, context.Canceled) || strings.Contains(msg, "statement timeout") { + slog.Debug("db exec timed out", "query", q, "query_truncated", truncated, "error", err) } else { - slog.Warn("db exec failed", "query", q, "error", err) + slog.Warn("db exec failed", "query", q, "query_truncated", truncated, "error", err) } } return res, err @@ -2680,6 +2688,22 @@ WITH snapshots AS ( MAX(s."SnapshotTime") AS last_seen FROM snapshots s GROUP BY s."VmId", s."VmUuid", s."Name", s."Vcenter" +), timeline_enriched AS ( + SELECT + tl."VmId", + tl."VmUuid", + tl."Name", + tl."Vcenter", + tl.any_creation, + tl.first_seen, + tl.last_seen, + MIN(t2.first_seen) AS t_last_after + FROM timeline tl + LEFT JOIN timeline t2 + ON t2."Vcenter" = tl."Vcenter" + AND COALESCE(t2."VmId", '') = COALESCE(tl."VmId", '') + AND t2.first_seen > tl.last_seen + GROUP BY tl."VmId", tl."VmUuid", tl."Name", tl."Vcenter", tl.any_creation, tl.first_seen, tl.last_seen ) UPDATE %s dst SET @@ -2688,23 +2712,12 @@ SET ELSE dst."CreationTime" END, "DeletionTime" = CASE - WHEN t_last_after IS NOT NULL + WHEN t.t_last_after IS NOT NULL AND (dst."DeletionTime" IS NULL OR dst."DeletionTime" = 0) - THEN t_last_after + THEN t.t_last_after ELSE dst."DeletionTime" END -FROM ( - SELECT - tl.*, - ( - SELECT MIN(s2."SnapshotTime") - FROM snapshots s2 - WHERE s2."Vcenter" = tl."Vcenter" - AND COALESCE(s2."VmId", '') = COALESCE(tl."VmId", '') - AND s2."SnapshotTime" > tl.last_seen - ) AS t_last_after - FROM timeline tl -) t +FROM timeline_enriched t WHERE dst."Vcenter" = t."Vcenter" AND ( (dst."VmId" IS NOT DISTINCT FROM t."VmId")