From ad7080d80185a61160a438a84d487d6e7760886a Mon Sep 17 00:00:00 2001 From: Ajay Date: Fri, 22 Jul 2022 19:03:46 -0400 Subject: [PATCH] Force replica if failed using normal alternates now --- src/databases/IDatabase.ts | 1 + src/databases/Postgres.ts | 13 ++++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/databases/IDatabase.ts b/src/databases/IDatabase.ts index 0211203..9cc82d4 100644 --- a/src/databases/IDatabase.ts +++ b/src/databases/IDatabase.ts @@ -1,5 +1,6 @@ export interface QueryOption { useReplica?: boolean; + forceReplica?: boolean; } export interface IDatabase { diff --git a/src/databases/Postgres.ts b/src/databases/Postgres.ts index dbaddb1..681a193 100644 --- a/src/databases/Postgres.ts +++ b/src/databases/Postgres.ts @@ -103,11 +103,13 @@ export class Postgres implements IDatabase { Logger.debug(`prepare (postgres): type: ${type}, query: ${query}, params: ${params}`); let tries = 0; + let lastPool: Pool = null; do { tries++; try { - const queryResult = await this.getPool(type, options).query({ text: query, values: params }); + lastPool = this.getPool(type, options); + const queryResult = await lastPool.query({ text: query, values: params }); switch (type) { case "get": { @@ -125,7 +127,12 @@ export class Postgres implements IDatabase { } } } catch (err) { - options.useReplica = false; + if (lastPool === this.pool) { + // Only applies if it is get or all request + options.forceReplica = true; + } else if (lastPool === this.poolRead) { + options.useReplica = false; + } Logger.error(`prepare (postgres) try ${tries}: ${err}`); } @@ -136,7 +143,7 @@ export class Postgres implements IDatabase { const readAvailable = this.poolRead && options.useReplica && (type === "get" || type === "all"); const ignroreReadDueToFailure = this.lastPoolReadFail > Date.now() - 1000 * 30; const readDueToFailure = this.lastPoolFail > Date.now() - 1000 * 30; - if (readAvailable && !ignroreReadDueToFailure && (readDueToFailure || + if (readAvailable && !ignroreReadDueToFailure && (options.forceReplica || readDueToFailure || Math.random() > 1 / (this.config.postgresReadOnly.weight + 1))) { return this.poolRead; } else {