diff --git a/packages/pg-pool/index.js b/packages/pg-pool/index.js index 0d7314eb6..5e846bb31 100644 --- a/packages/pg-pool/index.js +++ b/packages/pg-pool/index.js @@ -252,7 +252,7 @@ class Pool extends EventEmitter { this.log('new client connected') if (this.options.maxLifetimeSeconds !== 0) { - setTimeout(() => { + const maxLifetimeTimeout = setTimeout(() => { this.log('ending client due to expired lifetime') this._expired.add(client) const idleIndex = this._idle.findIndex((idleItem) => idleItem.client === client) @@ -265,6 +265,9 @@ class Pool extends EventEmitter { ) } }, this.options.maxLifetimeSeconds * 1000) + + maxLifetimeTimeout.unref() + client.once('end', () => clearTimeout(maxLifetimeTimeout)) } return this._acquireClient(client, pendingItem, idleListener, true) diff --git a/packages/pg-pool/test/idle-timeout-exit.js b/packages/pg-pool/test/idle-timeout-exit.js index 1292634a8..b557af7f6 100644 --- a/packages/pg-pool/test/idle-timeout-exit.js +++ b/packages/pg-pool/test/idle-timeout-exit.js @@ -3,7 +3,7 @@ if (module === require.main) { const allowExitOnIdle = process.env.ALLOW_EXIT_ON_IDLE === '1' const Pool = require('../index') - const pool = new Pool({ idleTimeoutMillis: 200, ...(allowExitOnIdle ? { allowExitOnIdle: true } : {}) }) + const pool = new Pool({ maxLifetimeSeconds: 2, idleTimeoutMillis: 200, ...(allowExitOnIdle ? { allowExitOnIdle: true } : {}) }) pool.query('SELECT NOW()', (err, res) => console.log('completed first')) pool.on('remove', () => { console.log('removed')