Merge pull request #3696 from mempool/mononaut/mysql-timeout
Add explicit timeout to mysql DB queries
This commit is contained in:
commit
1f2d05c5a4
@ -61,7 +61,8 @@
|
|||||||
"SOCKET": "/var/run/mysql/mysql.sock",
|
"SOCKET": "/var/run/mysql/mysql.sock",
|
||||||
"DATABASE": "mempool",
|
"DATABASE": "mempool",
|
||||||
"USERNAME": "mempool",
|
"USERNAME": "mempool",
|
||||||
"PASSWORD": "mempool"
|
"PASSWORD": "mempool",
|
||||||
|
"TIMEOUT": 180000
|
||||||
},
|
},
|
||||||
"SYSLOG": {
|
"SYSLOG": {
|
||||||
"ENABLED": true,
|
"ENABLED": true,
|
||||||
|
@ -62,7 +62,8 @@
|
|||||||
"PORT": 18,
|
"PORT": 18,
|
||||||
"DATABASE": "__DATABASE_DATABASE__",
|
"DATABASE": "__DATABASE_DATABASE__",
|
||||||
"USERNAME": "__DATABASE_USERNAME__",
|
"USERNAME": "__DATABASE_USERNAME__",
|
||||||
"PASSWORD": "__DATABASE_PASSWORD__"
|
"PASSWORD": "__DATABASE_PASSWORD__",
|
||||||
|
"TIMEOUT": "__DATABASE_TIMEOUT__"
|
||||||
},
|
},
|
||||||
"SYSLOG": {
|
"SYSLOG": {
|
||||||
"ENABLED": false,
|
"ENABLED": false,
|
||||||
|
@ -72,7 +72,8 @@ describe('Mempool Backend Config', () => {
|
|||||||
PORT: 3306,
|
PORT: 3306,
|
||||||
DATABASE: 'mempool',
|
DATABASE: 'mempool',
|
||||||
USERNAME: 'mempool',
|
USERNAME: 'mempool',
|
||||||
PASSWORD: 'mempool'
|
PASSWORD: 'mempool',
|
||||||
|
TIMEOUT: 180000,
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(config.SYSLOG).toStrictEqual({
|
expect(config.SYSLOG).toStrictEqual({
|
||||||
|
@ -86,6 +86,7 @@ interface IConfig {
|
|||||||
DATABASE: string;
|
DATABASE: string;
|
||||||
USERNAME: string;
|
USERNAME: string;
|
||||||
PASSWORD: string;
|
PASSWORD: string;
|
||||||
|
TIMEOUT: number;
|
||||||
};
|
};
|
||||||
SYSLOG: {
|
SYSLOG: {
|
||||||
ENABLED: boolean;
|
ENABLED: boolean;
|
||||||
@ -194,7 +195,8 @@ const defaults: IConfig = {
|
|||||||
'PORT': 3306,
|
'PORT': 3306,
|
||||||
'DATABASE': 'mempool',
|
'DATABASE': 'mempool',
|
||||||
'USERNAME': 'mempool',
|
'USERNAME': 'mempool',
|
||||||
'PASSWORD': 'mempool'
|
'PASSWORD': 'mempool',
|
||||||
|
'TIMEOUT': 180000,
|
||||||
},
|
},
|
||||||
'SYSLOG': {
|
'SYSLOG': {
|
||||||
'ENABLED': true,
|
'ENABLED': true,
|
||||||
|
@ -33,9 +33,33 @@ import { FieldPacket, OkPacket, PoolOptions, ResultSetHeader, RowDataPacket } fr
|
|||||||
OkPacket[] | ResultSetHeader>(query, params?): Promise<[T, FieldPacket[]]>
|
OkPacket[] | ResultSetHeader>(query, params?): Promise<[T, FieldPacket[]]>
|
||||||
{
|
{
|
||||||
this.checkDBFlag();
|
this.checkDBFlag();
|
||||||
|
let hardTimeout;
|
||||||
|
if (query?.timeout != null) {
|
||||||
|
hardTimeout = Math.floor(query.timeout * 1.1);
|
||||||
|
} else {
|
||||||
|
hardTimeout = config.DATABASE.TIMEOUT;
|
||||||
|
}
|
||||||
|
if (hardTimeout > 0) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const timer = setTimeout(() => {
|
||||||
|
reject(new Error(`DB query failed to return, reject or time out within ${hardTimeout / 1000}s - ${query?.sql?.slice(0, 160) || (typeof(query) === 'string' || query instanceof String ? query?.slice(0, 160) : 'unknown query')}`));
|
||||||
|
}, hardTimeout);
|
||||||
|
|
||||||
|
this.getPool().then(pool => {
|
||||||
|
return pool.query(query, params) as Promise<[T, FieldPacket[]]>;
|
||||||
|
}).then(result => {
|
||||||
|
resolve(result);
|
||||||
|
}).catch(error => {
|
||||||
|
reject(error);
|
||||||
|
}).finally(() => {
|
||||||
|
clearTimeout(timer);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} else {
|
||||||
const pool = await this.getPool();
|
const pool = await this.getPool();
|
||||||
return pool.query(query, params);
|
return pool.query(query, params);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async checkDbConnection() {
|
public async checkDbConnection() {
|
||||||
this.checkDBFlag();
|
this.checkDBFlag();
|
||||||
|
@ -269,6 +269,7 @@ Corresponding `docker-compose.yml` overrides:
|
|||||||
DATABASE_DATABASE: ""
|
DATABASE_DATABASE: ""
|
||||||
DATABASE_USERNAME: ""
|
DATABASE_USERNAME: ""
|
||||||
DATABASE_PASSWORD: ""
|
DATABASE_PASSWORD: ""
|
||||||
|
DATABASE_TIMEOUT: ""
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -60,7 +60,8 @@
|
|||||||
"PORT": __DATABASE_PORT__,
|
"PORT": __DATABASE_PORT__,
|
||||||
"DATABASE": "__DATABASE_DATABASE__",
|
"DATABASE": "__DATABASE_DATABASE__",
|
||||||
"USERNAME": "__DATABASE_USERNAME__",
|
"USERNAME": "__DATABASE_USERNAME__",
|
||||||
"PASSWORD": "__DATABASE_PASSWORD__"
|
"PASSWORD": "__DATABASE_PASSWORD__",
|
||||||
|
"TIMEOUT": "__DATABASE_TIMEOUT__"
|
||||||
},
|
},
|
||||||
"SYSLOG": {
|
"SYSLOG": {
|
||||||
"ENABLED": __SYSLOG_ENABLED__,
|
"ENABLED": __SYSLOG_ENABLED__,
|
||||||
|
@ -64,6 +64,7 @@ __DATABASE_PORT__=${DATABASE_PORT:=3306}
|
|||||||
__DATABASE_DATABASE__=${DATABASE_DATABASE:=mempool}
|
__DATABASE_DATABASE__=${DATABASE_DATABASE:=mempool}
|
||||||
__DATABASE_USERNAME__=${DATABASE_USERNAME:=mempool}
|
__DATABASE_USERNAME__=${DATABASE_USERNAME:=mempool}
|
||||||
__DATABASE_PASSWORD__=${DATABASE_PASSWORD:=mempool}
|
__DATABASE_PASSWORD__=${DATABASE_PASSWORD:=mempool}
|
||||||
|
__DATABASE_TIMEOUT__=${DATABASE_TIMEOUT:=180000}
|
||||||
|
|
||||||
# SYSLOG
|
# SYSLOG
|
||||||
__SYSLOG_ENABLED__=${SYSLOG_ENABLED:=false}
|
__SYSLOG_ENABLED__=${SYSLOG_ENABLED:=false}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user