mirror of
https://github.com/ajayyy/SponsorBlockServer.git
synced 2025-12-11 14:07:09 +03:00
Force replica if failed using normal
alternates now
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
export interface QueryOption {
|
export interface QueryOption {
|
||||||
useReplica?: boolean;
|
useReplica?: boolean;
|
||||||
|
forceReplica?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IDatabase {
|
export interface IDatabase {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user