Only use redis timeout when db not under load

This commit is contained in:
Ajay 2024-01-18 09:22:00 -05:00
parent d607d8b179
commit c9f7275942
6 changed files with 15 additions and 2 deletions

View file

@ -83,7 +83,8 @@ addDefaults(config, {
maxTries: 3,
maxActiveRequests: 0,
timeout: 60000,
highLoadThreshold: 10
highLoadThreshold: 10,
redisTimeoutThreshold: 1000
},
postgresReadOnly: {
enabled: false,

View file

@ -9,6 +9,8 @@ export interface IDatabase {
prepare(type: QueryType, query: string, params?: any[], options?: QueryOption): Promise<any | any[] | void>;
highLoad(): boolean;
shouldUseRedisTimeout(): boolean;
}
export type QueryType = "get" | "all" | "run";

View file

@ -283,4 +283,8 @@ export class Postgres implements IDatabase {
highLoad() {
return this.activePostgresRequests > this.config.postgres.highLoadThreshold;
}
shouldUseRedisTimeout() {
return this.activePostgresRequests < this.config.postgres.redisTimeoutThreshold;
}
}

View file

@ -108,6 +108,10 @@ export class Sqlite implements IDatabase {
highLoad() {
return false;
}
shouldUseRedisTimeout() {
return false;
}
}
export interface SqliteConfig {

View file

@ -27,6 +27,7 @@ export interface CustomWritePostgresConfig extends CustomPostgresConfig {
maxActiveRequests: number;
timeout: number;
highLoadThreshold: number;
redisTimeoutThreshold: number;
}
export interface CustomPostgresReadOnlyConfig extends CustomPostgresConfig {

View file

@ -70,7 +70,8 @@ if (config.redis?.enabled) {
const start = Date.now();
activeRequests++;
const timeout = config.redis.getTimeout ? setTimeout(() => reject(), config.redis.getTimeout) : null;
const shouldUseTimeout = config.redis.getTimeout && db.shouldUseRedisTimeout();
const timeout = shouldUseTimeout ? setTimeout(() => reject(), config.redis.getTimeout) : null;
const chosenGet = pickChoice(get, getRead);
chosenGet(key).then((reply) => {
if (timeout !== null) clearTimeout(timeout);