fix: honor chart analytics timeout

This commit is contained in:
gadgethd
2026-08-09 15:20:51 +00:00
parent dbe1d304ff
commit 92f2f11dfd
3 changed files with 17 additions and 4 deletions
+6 -3
View File
@@ -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) => {
+7 -1
View File
@@ -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);
});
+4
View File
@@ -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);