diff --git a/lib/connection.js b/lib/connection.js index 48d65d25f..489a5afd9 100644 --- a/lib/connection.js +++ b/lib/connection.js @@ -64,9 +64,8 @@ Connection.prototype.connect = function (port, host) { }) const reportStreamError = function (error) { - // don't raise ECONNRESET errors - they can & should be ignored - // during disconnect - if (self._ending && error.code === 'ECONNRESET') { + // errors about disconnections should be ignored during disconnect + if (self._ending && (error.code === 'ECONNRESET' || error.code === 'EPIPE')) { return } self.emit('error', error) diff --git a/package.json b/package.json index 9eaf4c256..66e399bc1 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "buffer-writer": "2.0.0", "packet-reader": "1.0.0", "pg-connection-string": "0.1.3", - "pg-pool": "^2.0.4", + "pg-pool": "^2.0.7", "pg-types": "^2.1.0", "pgpass": "1.x", "semver": "4.3.2" diff --git a/test/integration/connection-pool/error-tests.js b/test/integration/connection-pool/error-tests.js index cadffe3db..597c29b38 100644 --- a/test/integration/connection-pool/error-tests.js +++ b/test/integration/connection-pool/error-tests.js @@ -8,15 +8,13 @@ suite.test('connecting to invalid port', (cb) => { pool.connect().catch(e => cb()) }) -suite.test('errors emitted on pool', (cb) => { +suite.test('errors emitted on checked-out clients', (cb) => { // make pool hold 2 clients const pool = new pg.Pool({ max: 2 }) // get first client pool.connect(assert.success(function (client, done) { - client.id = 1 client.query('SELECT NOW()', function () { pool.connect(assert.success(function (client2, done2) { - client2.id = 2 var pidColName = 'procpid' helper.versionGTE(client2, 90200, assert.success(function (isGreater) { var killIdleQuery = 'SELECT pid, (SELECT pg_terminate_backend(pid)) AS killed FROM pg_stat_activity WHERE state = $1' @@ -26,10 +24,9 @@ suite.test('errors emitted on pool', (cb) => { params = ['%IDLE%'] } - pool.once('error', (err, brokenClient) => { - assert.ok(err) - assert.ok(brokenClient) - assert.equal(client.id, brokenClient.id) + client.once('error', (err) => { + client.on('error', (err) => {}) + done(err) cb() }) @@ -57,18 +54,18 @@ suite.test('connection-level errors cause queued queries to fail', (cb) => { } })) - pool.once('error', assert.calls((err, brokenClient) => { - assert.equal(client, brokenClient) + client.once('error', assert.calls((err) => { + client.on('error', (err) => {}) })) client.query('SELECT 1', assert.calls((err) => { if (helper.args.native) { - assert.ok(err) + assert.equal(err.message, 'terminating connection due to administrator command') } else { assert.equal(err.message, 'Connection terminated unexpectedly') } - done() + done(err) pool.end() cb() })) @@ -86,13 +83,16 @@ suite.test('connection-level errors cause future queries to fail', (cb) => { } })) - pool.once('error', assert.calls((err, brokenClient) => { - assert.equal(client, brokenClient) - + client.once('error', assert.calls((err) => { + client.on('error', (err) => {}) client.query('SELECT 1', assert.calls((err) => { - assert.equal(err.message, 'Client has encountered a connection error and is not queryable') + if (helper.args.native) { + assert.equal(err.message, 'terminating connection due to administrator command') + } else { + assert.equal(err.message, 'Client has encountered a connection error and is not queryable') + } - done() + done(err) pool.end() cb() })) diff --git a/test/integration/gh-issues/130-tests.js b/test/integration/gh-issues/130-tests.js index b3e2a2252..db3aeacd5 100644 --- a/test/integration/gh-issues/130-tests.js +++ b/test/integration/gh-issues/130-tests.js @@ -5,19 +5,21 @@ var exec = require('child_process').exec helper.pg.defaults.poolIdleTimeout = 1000 const pool = new helper.pg.Pool() -pool.connect(function (err, client) { +pool.connect(function (err, client, done) { + assert.ifError(err) + client.once('error', function (err) { + client.on('error', (err) => {}) + done(err) + }) client.query('SELECT pg_backend_pid()', function (err, result) { + assert.ifError(err) var pid = result.rows[0].pg_backend_pid var psql = 'psql' if (helper.args.host) psql = psql + ' -h ' + helper.args.host if (helper.args.port) psql = psql + ' -p ' + helper.args.port if (helper.args.user) psql = psql + ' -U ' + helper.args.user exec(psql + ' -c "select pg_terminate_backend(' + pid + ')" template1', assert.calls(function (error, stdout, stderr) { - assert.isNull(error) + assert.ifError(error) })) }) }) - -pool.on('error', function (err, client) { - // swallow errors -})