From 01fadd93d78ba37a57d2d09e01f0bce7f8d5869c Mon Sep 17 00:00:00 2001 From: Barry Hagan Date: Thu, 10 Jul 2025 14:30:48 -0500 Subject: [PATCH] fix #3508 - recheck min client count during idle callback (#3509) --- packages/pg-pool/index.js | 6 ++++-- packages/pg-pool/test/sizing.js | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/pg-pool/index.js b/packages/pg-pool/index.js index b3d9ada9..3e505f79 100644 --- a/packages/pg-pool/index.js +++ b/packages/pg-pool/index.js @@ -372,8 +372,10 @@ class Pool extends EventEmitter { let tid if (this.options.idleTimeoutMillis && this._isAboveMin()) { tid = setTimeout(() => { - this.log('remove idle client') - this._remove(client, this._pulseQueue.bind(this)) + if (this._isAboveMin()) { + this.log('remove idle client') + this._remove(client, this._pulseQueue.bind(this)) + } }, this.options.idleTimeoutMillis) if (this.options.allowExitOnIdle) { diff --git a/packages/pg-pool/test/sizing.js b/packages/pg-pool/test/sizing.js index c237995a..0e93d737 100644 --- a/packages/pg-pool/test/sizing.js +++ b/packages/pg-pool/test/sizing.js @@ -124,3 +124,19 @@ describe('pool size of 2', () => { }) ) }) + +describe('pool min size', () => { + it( + 'does not drop below min when clients released at same time', + co.wrap(function* () { + const pool = new Pool({ max: 2, min: 1, idleTimeoutMillis: 10 }) + const client = yield pool.connect() + const client2 = yield pool.connect() + client.release() + client2.release() + yield new Promise((resolve) => setTimeout(resolve, 20)) + expect(pool.idleCount).to.equal(1) + return yield pool.end() + }) + ) +})