Force replica if failed using normal

alternates now
This commit is contained in:
Ajay
2022-07-22 19:03:46 -04:00
parent 071aae5cf7
commit ad7080d801
2 changed files with 11 additions and 3 deletions

View File

@@ -1,5 +1,6 @@
export interface QueryOption { export interface QueryOption {
useReplica?: boolean; useReplica?: boolean;
forceReplica?: boolean;
} }
export interface IDatabase { export interface IDatabase {

View File

@@ -103,11 +103,13 @@ export class Postgres implements IDatabase {
Logger.debug(`prepare (postgres): type: ${type}, query: ${query}, params: ${params}`); Logger.debug(`prepare (postgres): type: ${type}, query: ${query}, params: ${params}`);
let tries = 0; let tries = 0;
let lastPool: Pool = null;
do { do {
tries++; tries++;
try { 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) { switch (type) {
case "get": { case "get": {
@@ -125,7 +127,12 @@ export class Postgres implements IDatabase {
} }
} }
} catch (err) { } 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}`); 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 readAvailable = this.poolRead && options.useReplica && (type === "get" || type === "all");
const ignroreReadDueToFailure = this.lastPoolReadFail > Date.now() - 1000 * 30; const ignroreReadDueToFailure = this.lastPoolReadFail > Date.now() - 1000 * 30;
const readDueToFailure = this.lastPoolFail > 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))) { Math.random() > 1 / (this.config.postgresReadOnly.weight + 1))) {
return this.poolRead; return this.poolRead;
} else { } else {