From 92f2f11dfd01bcfeaafb0a216ecbec24fd6457f1 Mon Sep 17 00:00:00 2001 From: gadgethd <111318106+gadgethd@users.noreply.github.com> Date: Sun, 9 Aug 2026 15:20:51 +0000 Subject: [PATCH] fix: honor chart analytics timeout --- backend/src/db/index.ts | 9 ++++++--- backend/src/platform/config/database.test.ts | 8 +++++++- backend/src/platform/config/database.ts | 4 ++++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/backend/src/db/index.ts b/backend/src/db/index.ts index 5397c71..475d35a 100644 --- a/backend/src/db/index.ts +++ b/backend/src/db/index.ts @@ -1,6 +1,9 @@ import pg from 'pg'; import fs from 'node:fs'; -import { databaseConfig } from '../platform/config/database.js'; +import { + analyticsStatementTimeoutMs, + databaseConfig, +} from '../platform/config/database.js'; import { resolveDbAssetPath } from './assets.js'; import { runMigrations } from './migrations.js'; import { UKMESH_NETWORKS } from '../networks.js'; @@ -58,8 +61,8 @@ const analyticsPool = new Pool({ max: 2, idleTimeoutMillis: databaseConfig.idleTimeoutMs, connectionTimeoutMillis: databaseConfig.connectionTimeoutMs, - statement_timeout: 300_000, // 5 minutes — analytics queries are intentionally slow - query_timeout: 300_000, + statement_timeout: analyticsStatementTimeoutMs(databaseConfig.statementTimeoutMs), + query_timeout: analyticsStatementTimeoutMs(databaseConfig.statementTimeoutMs), }); analyticsPool.on('error', (err) => { diff --git a/backend/src/platform/config/database.test.ts b/backend/src/platform/config/database.test.ts index 3e4110a..9a5a06b 100644 --- a/backend/src/platform/config/database.test.ts +++ b/backend/src/platform/config/database.test.ts @@ -1,7 +1,7 @@ import assert from 'node:assert/strict'; import test from 'node:test'; import { boundedIntegerSetting } from './boundedNumber.js'; -import { loadDatabaseConfig } from './database.js'; +import { analyticsStatementTimeoutMs, loadDatabaseConfig } from './database.js'; test('database numeric settings use bounded deployment-safe defaults', () => { assert.deepEqual(loadDatabaseConfig({}), { @@ -48,3 +48,9 @@ test('database configuration rejects invalid pool, timeout, and schema settings /Invalid DATABASE_SCHEMA/, ); }); + +test('analytics queries honor a longer configured timeout while retaining a safe floor', () => { + assert.equal(analyticsStatementTimeoutMs(30_000), 300_000); + assert.equal(analyticsStatementTimeoutMs(900_000), 900_000); + assert.equal(analyticsStatementTimeoutMs(0), 0); +}); diff --git a/backend/src/platform/config/database.ts b/backend/src/platform/config/database.ts index a167b18..7e0de71 100644 --- a/backend/src/platform/config/database.ts +++ b/backend/src/platform/config/database.ts @@ -37,4 +37,8 @@ export function loadDatabaseConfig(env: NodeJS.ProcessEnv) { } as const; } +export function analyticsStatementTimeoutMs(configuredTimeoutMs: number): number { + return configuredTimeoutMs === 0 ? 0 : Math.max(300_000, configuredTimeoutMs); +} + export const databaseConfig = loadDatabaseConfig(process.env);