Skip to content

Commit b32b227

Browse files
committed
fix(pool): getConnection callback should be called only once
1 parent a97ff42 commit b32b227

File tree

2 files changed

+28
-25
lines changed

2 files changed

+28
-25
lines changed

lib/pool.js

+11-8
Original file line numberDiff line numberDiff line change
@@ -81,20 +81,23 @@ class Pool extends EventEmitter {
8181

8282
if (this.config.acquireTimeout > 0) {
8383

84-
const timeout = setTimeout(() => {
84+
// eslint-disable-next-line prefer-const
85+
let timer;
8586

86-
spliceConnection(this._connectionQueue, cb);
87-
cb(new Error('Timeout acquiring connection'));
88-
89-
}, this.config.acquireTimeout);
87+
const wrappedCb = (err, connection) => {
9088

91-
return this._connectionQueue.push((err, connection) => {
89+
clearTimeout(timer);
90+
cb(err, connection);
91+
};
9292

93-
clearTimeout(timeout);
93+
timer = setTimeout(() => {
9494

95-
cb(err, connection);
95+
spliceConnection(this._connectionQueue, wrappedCb);
96+
cb(new Error('Timeout acquiring connection'));
9697

9798
}, this.config.acquireTimeout);
99+
100+
return this._connectionQueue.push(wrappedCb);
98101
}
99102

100103
return this._connectionQueue.push(cb);

test/integration/test-pool-acquire-timeout.js

+17-17
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
'use strict';
22

33
const mysql = require('../..');
4-
const test = require('utest');
54
const assert = require('assert');
6-
const common = require('../common');
5+
const common = require('../common.test.cjs');
76

87
const poolConfig = common.getConfig();
98

@@ -15,33 +14,34 @@ const poolWithAcquireTimeout = new mysql.createPool({
1514
});
1615

1716
poolWithAcquireTimeout.getConnection((err, c1) => {
17+
1818
assert.equal(!!c1, true);
1919
assert.ifError(err);
20+
2021
poolWithAcquireTimeout.getConnection((err, c2) => {
22+
2123
assert.ifError(err);
2224
assert.equal(!!c2, true);
25+
2326
const C3_STARTED_AT = Date.now();
27+
2428
poolWithAcquireTimeout.getConnection((e3, c3) => {
2529
const C3_DONE_AT = Date.now();
30+
assert.equal(C3_DONE_AT - C3_STARTED_AT >= ACQUIRE_TIMEOUT, true);
31+
assert.equal(C3_DONE_AT - C3_STARTED_AT < ACQUIRE_TIMEOUT * 2, true);
2632

27-
poolWithAcquireTimeout.releaseConnection(c1);
33+
assert.notEqual(e3, null);
34+
assert.equal(!c3, true);
35+
c1.release();
2836

2937
poolWithAcquireTimeout.getConnection((e4, c4) => {
3038

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 >= ACQUIRE_TIMEOUT, true);
36-
assert.equal(C3_DONE_AT - C3_STARTED_AT < ACQUIRE_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);
39+
assert.equal(e4, null);
40+
assert.equal(!!c4, true);
41+
42+
c4.release();
43+
c2.release();
44+
poolWithAcquireTimeout.end();
4545
});
4646
});
4747
});

0 commit comments

Comments
 (0)