File tree 2 files changed +33
-0
lines changed
2 files changed +33
-0
lines changed Original file line number Diff line number Diff line change @@ -316,13 +316,31 @@ class Pool extends EventEmitter {
316
316
}
317
317
const response = promisify ( this . Promise , cb )
318
318
cb = response . callback
319
+
319
320
this . connect ( ( err , client ) => {
320
321
if ( err ) {
321
322
return cb ( err )
322
323
}
324
+
325
+ let clientReleased = false
326
+ const onError = ( err ) => {
327
+ if ( clientReleased ) {
328
+ return
329
+ }
330
+ clientReleased = true
331
+ client . release ( err )
332
+ cb ( err )
333
+ }
334
+
335
+ client . once ( 'error' , onError )
323
336
this . log ( 'dispatching query' )
324
337
client . query ( text , values , ( err , res ) => {
325
338
this . log ( 'query dispatched' )
339
+ client . removeListener ( 'error' , onError )
340
+ if ( clientReleased ) {
341
+ return
342
+ }
343
+ clientReleased = true
326
344
client . release ( err )
327
345
if ( err ) {
328
346
return cb ( err )
Original file line number Diff line number Diff line change @@ -226,4 +226,19 @@ describe('pool error handling', function () {
226
226
} )
227
227
} )
228
228
} )
229
+
230
+ it ( 'handles post-checkout client failures in pool.query' , ( done ) => {
231
+ const pool = new Pool ( { max : 1 } )
232
+ pool . on ( 'error' , ( ) => {
233
+ // We double close the connection in this test, prevent exception caused by that
234
+ } )
235
+ pool . query ( 'SELECT pg_sleep(5)' , [ ] , ( err ) => {
236
+ expect ( err ) . to . be . an ( Error )
237
+ done ( )
238
+ } )
239
+
240
+ setTimeout ( ( ) => {
241
+ pool . _clients [ 0 ] . end ( )
242
+ } , 1000 )
243
+ } )
229
244
} )
You can’t perform that action at this time.
0 commit comments