From b8457bb921dd0c40698f40ae6bb24335f05960a3 Mon Sep 17 00:00:00 2001 From: Petteri Sulonen Date: Mon, 20 May 2019 12:57:23 +0300 Subject: [PATCH 1/2] Implement 'release' event and 'activeCount' property. https://github.com/brianc/node-pg-pool/issues/124 --- index.js | 13 ++++++++++--- test/events.js | 21 +++++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index cfe377c..b4525f0 100644 --- a/index.js +++ b/index.js @@ -44,8 +44,9 @@ function release (client, err) { this._remove(client) }, this.options.idleTimeoutMillis) } - this._idle.push(new IdleItem(client, tid)) + this._active.splice(this._active.indexOf(client, 1)) + this.emit('release', client) this._pulseQueue() } @@ -94,6 +95,7 @@ class Pool extends EventEmitter { this._clients = [] this._idle = [] + this._active = [] this._pendingQueue = [] this._endCallback = undefined this.ending = false @@ -149,8 +151,8 @@ class Pool extends EventEmitter { _remove (client) { const removed = removeWhere( - this._idle, - item => item.client === client + this._idle, + item => item.client === client ) if (removed !== undefined) { @@ -250,6 +252,7 @@ class Pool extends EventEmitter { } else { this.log('new client connected') client.release = release.bind(this, client) + this._active.push(client) this.emit('connect', client) this.emit('acquire', client) if (!pendingItem.timedOut) { @@ -328,5 +331,9 @@ class Pool extends EventEmitter { get totalCount () { return this._clients.length } + + get activeCount () { + return this._active.length + } } module.exports = Pool diff --git a/test/events.js b/test/events.js index a2da481..421d06b 100644 --- a/test/events.js +++ b/test/events.js @@ -60,6 +60,27 @@ describe('events', function () { }, 100) }) + it('emits release every time a client is released', function (done) { + const pool = new Pool() + let releaseCount = 0 + pool.on('release', function (client) { + expect(client).to.be.ok() + releaseCount++ + }) + for (let i = 0; i < 10; i++) { + pool.connect(function (err, client, release) { + if (err) return done(err) + expect(pool.activeCount).to.be.greaterThan(0) + setTimeout(release, 1) + }) + } + setTimeout(function () { + expect(releaseCount).to.be(10) + expect(pool.activeCount).to.be(0) + pool.end(done) + }, 100) + }) + it('emits error and client if an idle client in the pool hits an error', function (done) { const pool = new Pool() pool.connect(function (err, client) { From 8b5d49f4e70c7f1216420cc494533c1ddaed91bc Mon Sep 17 00:00:00 2001 From: Petteri Sulonen Date: Tue, 21 May 2019 08:10:47 +0300 Subject: [PATCH 2/2] Fix bug erroneously truncating ._active array and improve test case to fully test .activeCount property. https://github.com/brianc/node-pg-pool/issues/124 --- index.js | 6 +++--- test/events.js | 9 ++++++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/index.js b/index.js index b4525f0..7789bb5 100644 --- a/index.js +++ b/index.js @@ -45,7 +45,7 @@ function release (client, err) { }, this.options.idleTimeoutMillis) } this._idle.push(new IdleItem(client, tid)) - this._active.splice(this._active.indexOf(client, 1)) + this._active.splice(this._active.indexOf(client), 1) this.emit('release', client) this._pulseQueue() } @@ -151,8 +151,8 @@ class Pool extends EventEmitter { _remove (client) { const removed = removeWhere( - this._idle, - item => item.client === client + this._idle, + item => item.client === client ) if (removed !== undefined) { diff --git a/test/events.js b/test/events.js index 421d06b..82b1e0d 100644 --- a/test/events.js +++ b/test/events.js @@ -67,11 +67,14 @@ describe('events', function () { expect(client).to.be.ok() releaseCount++ }) - for (let i = 0; i < 10; i++) { + for (let releases = [], i = 0; i < 10; i++) { pool.connect(function (err, client, release) { if (err) return done(err) - expect(pool.activeCount).to.be.greaterThan(0) - setTimeout(release, 1) + releases.push(release) + expect(pool.activeCount).to.be(releases.length) + if (releases.length === 10) { + while (releases.length > 0) releases.pop()() + } }) } setTimeout(function () {