diff --git a/src/config.ts b/src/config.ts index 568aa0c..91020b6 100644 --- a/src/config.ts +++ b/src/config.ts @@ -76,7 +76,8 @@ addDefaults(config, { port: 5432, max: 10, idleTimeoutMillis: 10000, - maxTries: 3 + maxTries: 3, + maxActiveRequests: -1 }, postgresReadOnly: { enabled: false, diff --git a/src/databases/Postgres.ts b/src/databases/Postgres.ts index db72021..a47da54 100644 --- a/src/databases/Postgres.ts +++ b/src/databases/Postgres.ts @@ -3,7 +3,7 @@ import { IDatabase, QueryOption, QueryType } from "./IDatabase"; import { Client, Pool, QueryResult, types } from "pg"; import fs from "fs"; -import { CustomPostgresConfig, CustomPostgresReadOnlyConfig } from "../types/config.model"; +import { CustomPostgresReadOnlyConfig, CustomWritePostgresConfig } from "../types/config.model"; import { timeoutPomise, PromiseWithState, savePromiseState, nextFulfilment } from "../utils/promise"; // return numeric (pg_type oid=1700) as float @@ -22,7 +22,7 @@ export interface DatabaseConfig { fileNamePrefix: string, readOnly: boolean, createDbIfNotExists: boolean, - postgres: CustomPostgresConfig, + postgres: CustomWritePostgresConfig, postgresReadOnly: CustomPostgresReadOnlyConfig } @@ -105,6 +105,10 @@ export class Postgres implements IDatabase { Logger.debug(`prepare (postgres): type: ${type}, query: ${query}, params: ${params}`); + if (this.activePostgresRequests > this.config.postgres.maxActiveRequests) { + throw new Error("Too many active postgres requests"); + } + const pendingQueries: PromiseWithState>[] = []; let tries = 0; let lastPool: Pool = null; diff --git a/src/types/config.model.ts b/src/types/config.model.ts index 3450b72..8b06c56 100644 --- a/src/types/config.model.ts +++ b/src/types/config.model.ts @@ -19,6 +19,10 @@ export interface CustomPostgresConfig extends PoolConfig { maxTries: number; } +export interface CustomWritePostgresConfig extends CustomPostgresConfig { + maxActiveRequests: number; +} + export interface CustomPostgresReadOnlyConfig extends CustomPostgresConfig { weight: number; readTimeout: number; @@ -71,7 +75,7 @@ export interface SBSConfig { redisRead?: RedisReadOnlyConfig; redisRateLimit: boolean; maxRewardTimePerSegmentInSeconds?: number; - postgres?: CustomPostgresConfig; + postgres?: CustomWritePostgresConfig; postgresReadOnly?: CustomPostgresReadOnlyConfig; dumpDatabase?: DumpDatabase; diskCacheURL: string;