Skip to content

Commit e0789d7

Browse files
committed
feat(pool): added acquireTimeout supports
1 parent cf3fa60 commit e0789d7

File tree

4 files changed

+72
-1
lines changed

4 files changed

+72
-1
lines changed

lib/connection_config.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ const validOptions = {
6565
idleTimeout: 1,
6666
Promise: 1,
6767
queueLimit: 1,
68-
waitForConnections: 1
68+
waitForConnections: 1,
69+
acquireTimeout: 1
6970
};
7071

7172
class ConnectionConfig {

lib/pool.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,25 @@ class Pool extends EventEmitter {
7878
return cb(new Error('Queue limit reached.'));
7979
}
8080
this.emit('enqueue');
81+
82+
if (this.config.acquireTimeout > 0) {
83+
84+
const timeout = setTimeout(() => {
85+
86+
spliceConnection(this._connectionQueue, cb);
87+
cb(new Error('Timeout acquiring connection'));
88+
89+
}, this.config.acquireTimeout);
90+
91+
return this._connectionQueue.push((err, connection) => {
92+
93+
clearTimeout(timeout);
94+
95+
cb(err, connection);
96+
97+
}, this.config.acquireTimeout);
98+
}
99+
81100
return this._connectionQueue.push(cb);
82101
}
83102

lib/pool_config.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ class PoolConfig {
1515
this.connectionLimit = isNaN(options.connectionLimit)
1616
? 10
1717
: Number(options.connectionLimit);
18+
this.acquireTimeout = Number.isInteger(options.acquireTimeout) && options.acquireTimeout >= 0
19+
? options.acquireTimeout
20+
: 10000;
1821
this.maxIdle = isNaN(options.maxIdle)
1922
? this.connectionLimit
2023
: Number(options.maxIdle);
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
'use strict';
2+
3+
const mysql = require('../..');
4+
const test = require('utest');
5+
const assert = require('assert');
6+
const common = require('../common');
7+
8+
const poolConfig = common.getConfig();
9+
10+
const ACQUITE_TIMEOUT = 500;
11+
const poolWithAcquireTimeout = new mysql.createPool({
12+
...poolConfig,
13+
acquireTimeout: ACQUITE_TIMEOUT,
14+
connectionLimit: 2
15+
});
16+
17+
poolWithAcquireTimeout.getConnection(function (err, c1) {
18+
assert.equal(!!c1, true);
19+
assert.ifError(err);
20+
poolWithAcquireTimeout.getConnection(function (err, c2) {
21+
assert.ifError(err);
22+
assert.equal(!!c2, true);
23+
const C3_STARTED_AT = Date.now();
24+
poolWithAcquireTimeout.getConnection(function (e3, c3) {
25+
const C3_DONE_AT = Date.now();
26+
27+
poolWithAcquireTimeout.releaseConnection(c1);
28+
29+
poolWithAcquireTimeout.getConnection(function (e4, c4) {
30+
31+
test('Pool With Acquire Timeout', {
32+
'timeout of pool is full': () => {
33+
assert.equal(e3 !== null, true);
34+
assert.equal(!c3, true);
35+
assert.equal(C3_DONE_AT - C3_STARTED_AT >= ACQUITE_TIMEOUT, true);
36+
assert.equal(C3_DONE_AT - C3_STARTED_AT < ACQUITE_TIMEOUT * 2, true);
37+
},
38+
'ok if pool is not full': () => {
39+
assert.equal(e4 === null, true);
40+
assert.equal(!!c4, true);
41+
}
42+
});
43+
44+
poolWithAcquireTimeout.releaseConnection(c4);
45+
});
46+
});
47+
});
48+
});

0 commit comments

Comments
 (0)