From 5d24928ee45e227bc41919c2fbbb34fa84b513a3 Mon Sep 17 00:00:00 2001 From: Barry Hagan Date: Wed, 9 Jul 2025 21:50:32 -0500 Subject: [PATCH] fix #3508 - recheck min client count during idle callback --- 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 b3d9ada96..3e505f797 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 c237995a8..0e93d7376 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() + }) + ) +})