diff --git a/lib/postgresMgr.js b/lib/postgresMgr.js index 09748df..5f19206 100644 --- a/lib/postgresMgr.js +++ b/lib/postgresMgr.js @@ -1629,19 +1629,26 @@ PostgresMgr.prototype._pgQueryKick = function () { if (!self._pgClient) { self._pgClient = new Client(self._url.href); + var selfClient = self._pgClient; self._pgClient.once('error', function (err) { log.error({err: err}, 'got pg client error'); - self._pgClient.removeAllListeners(); - if (self._pgRequestOutstanding !== null) { - self._pgQueryFini(err); - } else { - /* See _pgQueryFini(). */ - self._pgClient = null; + if (self._pgClient !== selfClient) { + // Actually we've already been booted, or possibly even + // replaced (null check alone does not seem sufficient). + return; } + self._pgClient = null; }); self._pgClient.connect(); } + var pgClientErrorHandlerClient = self._pgClient; // ugh + var pgClientErrorHandler = function (err) { + log.error({err: err}, 'got pg client error (for request)'); + self._pgQueryFini(rq, err); + }; + self._pgClient.once('error', pgClientErrorHandler); + query = self._pgClient.query(queryStr); result = null; log.trace('querying', query); @@ -1652,32 +1659,29 @@ PostgresMgr.prototype._pgQueryKick = function () { }); query.once('error', function (err) { - /* - * It's conceivable in this case that we got a client error and already - * finished handling this request above. In that case, we ignore this - * second error. - */ - if (rq == self._pgRequestOutstanding) { - self._pgQueryFini(err); - } else { - log.debug({ 'err': err }, - 'got query error for non-outstanding request'); - } + pgClientErrorHandlerClient.removeListener('error', pgClientErrorHandler); + self._pgQueryFini(rq, err); }); query.once('end', function () { - assert.ok(rq == self._pgRequestOutstanding); - self._pgQueryFini(null, result); + pgClientErrorHandlerClient.removeListener('error', pgClientErrorHandler); + self._pgQueryFini(rq, null, result); }); }; -PostgresMgr.prototype._pgQueryFini = function (err, result) { +PostgresMgr.prototype._pgQueryFini = function (rq, err, result) { var self = this; var log = self._log; - var rq; - assert.ok(self._pgRequestOutstanding !== null); - rq = self._pgRequestOutstanding; + if (self._pgRequestOutstanding !== rq) { + // this request already finished in some way + if (err) { + log.warn({ 'err': err }, 'got [spurious] err'); + } else { + log.trace('query [spuriously] ended!'); + } + return; + } self._pgRequestOutstanding = null; if (err) {