Skip to content

Commit e05f219

Browse files
committed
Add explicit timeout to mysql DB queries
1 parent f61f520 commit e05f219

File tree

8 files changed

+39
-7
lines changed

8 files changed

+39
-7
lines changed

backend/mempool-config.sample.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@
6161
"SOCKET": "/var/run/mysql/mysql.sock",
6262
"DATABASE": "mempool",
6363
"USERNAME": "mempool",
64-
"PASSWORD": "mempool"
64+
"PASSWORD": "mempool",
65+
"TIMEOUT": 180000
6566
},
6667
"SYSLOG": {
6768
"ENABLED": true,

backend/src/__fixtures__/mempool-config.template.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@
6262
"PORT": 18,
6363
"DATABASE": "__DATABASE_DATABASE__",
6464
"USERNAME": "__DATABASE_USERNAME__",
65-
"PASSWORD": "__DATABASE_PASSWORD__"
65+
"PASSWORD": "__DATABASE_PASSWORD__",
66+
"TIMEOUT": "__DATABASE_TIMEOUT__"
6667
},
6768
"SYSLOG": {
6869
"ENABLED": false,

backend/src/__tests__/config.test.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ describe('Mempool Backend Config', () => {
7272
PORT: 3306,
7373
DATABASE: 'mempool',
7474
USERNAME: 'mempool',
75-
PASSWORD: 'mempool'
75+
PASSWORD: 'mempool',
76+
TIMEOUT: 180000,
7677
});
7778

7879
expect(config.SYSLOG).toStrictEqual({

backend/src/config.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ interface IConfig {
8686
DATABASE: string;
8787
USERNAME: string;
8888
PASSWORD: string;
89+
TIMEOUT: number;
8990
};
9091
SYSLOG: {
9192
ENABLED: boolean;
@@ -194,7 +195,8 @@ const defaults: IConfig = {
194195
'PORT': 3306,
195196
'DATABASE': 'mempool',
196197
'USERNAME': 'mempool',
197-
'PASSWORD': 'mempool'
198+
'PASSWORD': 'mempool',
199+
'TIMEOUT': 180000,
198200
},
199201
'SYSLOG': {
200202
'ENABLED': true,

backend/src/database.ts

+26-2
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,32 @@ import { FieldPacket, OkPacket, PoolOptions, ResultSetHeader, RowDataPacket } fr
3333
OkPacket[] | ResultSetHeader>(query, params?): Promise<[T, FieldPacket[]]>
3434
{
3535
this.checkDBFlag();
36-
const pool = await this.getPool();
37-
return pool.query(query, params);
36+
let hardTimeout;
37+
if (query?.timeout != null) {
38+
hardTimeout = Math.floor(query.timeout * 1.1);
39+
} else {
40+
hardTimeout = config.DATABASE.TIMEOUT;
41+
}
42+
if (hardTimeout > 0) {
43+
return new Promise((resolve, reject) => {
44+
const timer = setTimeout(() => {
45+
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')}`));
46+
}, hardTimeout);
47+
48+
this.getPool().then(pool => {
49+
return pool.query(query, params) as Promise<[T, FieldPacket[]]>;
50+
}).then(result => {
51+
resolve(result);
52+
}).catch(error => {
53+
reject(error);
54+
}).finally(() => {
55+
clearTimeout(timer);
56+
});
57+
});
58+
} else {
59+
const pool = await this.getPool();
60+
return pool.query(query, params);
61+
}
3862
}
3963

4064
public async checkDbConnection() {

docker/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@ Corresponding `docker-compose.yml` overrides:
269269
DATABASE_DATABASE: ""
270270
DATABASE_USERNAME: ""
271271
DATABASE_PASSWORD: ""
272+
DATABASE_TIMEOUT: ""
272273
...
273274
```
274275

docker/backend/mempool-config.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@
6060
"PORT": __DATABASE_PORT__,
6161
"DATABASE": "__DATABASE_DATABASE__",
6262
"USERNAME": "__DATABASE_USERNAME__",
63-
"PASSWORD": "__DATABASE_PASSWORD__"
63+
"PASSWORD": "__DATABASE_PASSWORD__",
64+
"TIMEOUT": "__DATABASE_TIMEOUT__"
6465
},
6566
"SYSLOG": {
6667
"ENABLED": __SYSLOG_ENABLED__,

docker/backend/start.sh

+1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ __DATABASE_PORT__=${DATABASE_PORT:=3306}
6464
__DATABASE_DATABASE__=${DATABASE_DATABASE:=mempool}
6565
__DATABASE_USERNAME__=${DATABASE_USERNAME:=mempool}
6666
__DATABASE_PASSWORD__=${DATABASE_PASSWORD:=mempool}
67+
__DATABASE_TIMEOUT__=${DATABASE_TIMEOUT:=180000}
6768

6869
# SYSLOG
6970
__SYSLOG_ENABLED__=${SYSLOG_ENABLED:=false}

0 commit comments

Comments
 (0)