fix sql timeout
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2026-02-11 11:04:19 +11:00
parent b5bcea9da5
commit 34ac9287b4

View File

@@ -97,11 +97,19 @@ func execLog(ctx context.Context, dbConn *sqlx.DB, query string, args ...interfa
res, err := dbConn.ExecContext(ctx, query, args...) res, err := dbConn.ExecContext(ctx, query, args...)
if err != nil { if err != nil {
q := strings.TrimSpace(query) q := strings.TrimSpace(query)
const maxQueryLogChars = 240
truncated := false
if len(q) > maxQueryLogChars {
q = q[:maxQueryLogChars] + " ... [truncated]"
truncated = true
}
msg := strings.ToLower(err.Error()) msg := strings.ToLower(err.Error())
if strings.Contains(msg, "duplicate column name") || strings.Contains(msg, "already exists") { 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 { } 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 return res, err
@@ -2680,6 +2688,22 @@ WITH snapshots AS (
MAX(s."SnapshotTime") AS last_seen MAX(s."SnapshotTime") AS last_seen
FROM snapshots s FROM snapshots s
GROUP BY s."VmId", s."VmUuid", s."Name", s."Vcenter" 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 UPDATE %s dst
SET SET
@@ -2688,23 +2712,12 @@ SET
ELSE dst."CreationTime" ELSE dst."CreationTime"
END, END,
"DeletionTime" = CASE "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) AND (dst."DeletionTime" IS NULL OR dst."DeletionTime" = 0)
THEN t_last_after THEN t.t_last_after
ELSE dst."DeletionTime" ELSE dst."DeletionTime"
END END
FROM ( FROM timeline_enriched t
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
WHERE dst."Vcenter" = t."Vcenter" WHERE dst."Vcenter" = t."Vcenter"
AND ( AND (
(dst."VmId" IS NOT DISTINCT FROM t."VmId") (dst."VmId" IS NOT DISTINCT FROM t."VmId")