@@ -367,16 +367,10 @@ defmodule Postgrex.Protocol do
367367 status = new_status ( opts , prepare: prepare )
368368 comment = Keyword . get ( opts , :comment )
369369
370- result =
371- case prepare do
372- true ->
373- parse_describe_close ( s , status , query )
374-
375- false ->
376- parse_describe_flush ( s , status , query , comment )
377- end
378-
379- handle_disconnect_retry ( result )
370+ case prepare do
371+ true -> parse_describe_close ( s , status , query )
372+ false -> parse_describe_flush ( s , status , query , comment )
373+ end
380374 end
381375
382376 def handle_prepare ( % Query { } = query , opts , % { queries: nil } = s ) do
@@ -398,9 +392,8 @@ defmodule Postgrex.Protocol do
398392 false -> close_parse_describe_flush ( s , status , query , comment )
399393 end
400394
401- case result do
402- { :ok , query , s } -> { :ok , query , % { s | messages: [ ] } }
403- other -> handle_disconnect_retry ( other )
395+ with { :ok , query , s } <- result do
396+ { :ok , query , % { s | messages: [ ] } }
404397 end
405398 end
406399 end
@@ -429,12 +422,8 @@ defmodule Postgrex.Protocol do
429422 | { :disconnect | :disconnect_and_retry , % DBConnection.ConnectionError { } , state }
430423 def handle_execute ( % Query { } = query , params , opts , s ) do
431424 case Keyword . get ( opts , :postgrex_copy , false ) do
432- true ->
433- handle_execute_copy ( query , params , opts , s )
434-
435- false ->
436- result = handle_execute_result ( query , params , opts , s )
437- handle_disconnect_retry ( result )
425+ true -> handle_execute_copy ( query , params , opts , s )
426+ false -> handle_execute_result ( query , params , opts , s )
438427 end
439428 end
440429
@@ -513,17 +502,15 @@ defmodule Postgrex.Protocol do
513502 | { :disconnect , % RuntimeError { } , state }
514503 | { :disconnect | :disconnect_and_retry , % DBConnection.ConnectionError { } , state }
515504 def handle_close ( % Query { ref: ref } = query , opts , % { postgres: { _ , ref } } = s ) do
516- result = flushed_close ( s , new_status ( opts ) , query )
517- handle_disconnect_retry ( result )
505+ flushed_close ( s , new_status ( opts ) , query )
518506 end
519507
520508 def handle_close ( % Query { } = query , _ , % { postgres: { _ , _ } } = s ) do
521509 lock_error ( s , :close , query )
522510 end
523511
524512 def handle_close ( % Query { } = query , opts , s ) do
525- result = close ( s , new_status ( opts ) , query )
526- handle_disconnect_retry ( result )
513+ close ( s , new_status ( opts ) , query )
527514 end
528515
529516 @ impl true
@@ -602,8 +589,7 @@ defmodule Postgrex.Protocol do
602589 case Keyword . get ( opts , :mode , :transaction ) do
603590 :transaction when postgres == :idle ->
604591 statement = "BEGIN"
605- result = handle_transaction ( statement , opts , s )
606- handle_disconnect_retry ( result )
592+ handle_transaction ( statement , opts , s )
607593
608594 :savepoint when postgres == :transaction ->
609595 statement = "SAVEPOINT postgrex_savepoint"
@@ -1322,8 +1308,8 @@ defmodule Postgrex.Protocol do
13221308 { :reload , oids , s , buffer } ->
13231309 reload_ready ( s , status , query , oids , buffer )
13241310
1325- { :disconnect , err , s } ->
1326- { : disconnect, err , s }
1311+ { :disconnect , _err , s } = disconnect ->
1312+ retry_disconnect ( disconnect , s . postgres )
13271313
13281314 { :error , % Postgrex.Error { } = err , s , buffer } ->
13291315 error_ready ( s , status , err , buffer )
@@ -1374,8 +1360,8 @@ defmodule Postgrex.Protocol do
13741360 { :reload , oids , s , buffer } ->
13751361 reload_closed ( s , status , query , oids , buffer )
13761362
1377- { :disconnect , err , s } ->
1378- { : disconnect, err , s }
1363+ { :disconnect , _err , s } = disconnect ->
1364+ retry_disconnect ( disconnect , s . postgres )
13791365
13801366 { :error , % Postgrex.Error { } = err , s , buffer } ->
13811367 error_ready ( s , status , err , buffer )
@@ -1403,8 +1389,8 @@ defmodule Postgrex.Protocol do
14031389 { :reload , oids , s , buffer } ->
14041390 reload_flushed ( s , status , query , oids , buffer )
14051391
1406- { :disconnect , _err , _s } = disconnect ->
1407- disconnect
1392+ { :disconnect , _err , s } = disconnect ->
1393+ retry_disconnect ( disconnect , s . postgres )
14081394 end
14091395 end
14101396
@@ -1457,8 +1443,8 @@ defmodule Postgrex.Protocol do
14571443 { :reload , oids , s , buffer } ->
14581444 reload_ready ( s , status , query , oids , buffer )
14591445
1460- { :disconnect , err , s } ->
1461- { : disconnect, err , s }
1446+ { :disconnect , _err , s } = disconnect ->
1447+ retry_disconnect ( disconnect , s . postgres )
14621448
14631449 { :error , % Postgrex.Error { } = err , s , buffer } ->
14641450 error_ready ( s , status , err , buffer )
@@ -1522,8 +1508,8 @@ defmodule Postgrex.Protocol do
15221508 { :reload , oids , s , buffer } ->
15231509 reload_flushed ( s , status , query , oids , buffer )
15241510
1525- { :disconnect , _err , _s } = disconnect ->
1526- disconnect
1511+ { :disconnect , _err , s } = disconnect ->
1512+ retry_disconnect ( disconnect , s . postgres )
15271513 end
15281514 end
15291515
@@ -2093,7 +2079,7 @@ defmodule Postgrex.Protocol do
20932079 bind_execute_close ( s , status , query , params )
20942080
20952081 { error , _ , _ } = other when error in [ :error , :disconnect ] ->
2096- handle_disconnect_retry ( other )
2082+ other
20972083 end
20982084 end
20992085
@@ -2126,8 +2112,8 @@ defmodule Postgrex.Protocol do
21262112 msg_sync ( )
21272113 ]
21282114
2129- with :ok <- msg_send ( % { s | buffer: nil } , msgs , buffer ) ,
2130- { :ok , s , buffer } <- recv_bind ( s , status , buffer ) ,
2115+ with :ok <- msg_send ( % { s | buffer: nil } , msgs , buffer ) |> retry_disconnect ( s . postgres ) ,
2116+ { :ok , s , buffer } <- recv_bind ( s , status , buffer ) |> retry_disconnect ( s . postgres ) ,
21312117 { :ok , result , s , buffer } <- recv_execute ( s , status , query , buffer ) ,
21322118 { :ok , s , buffer } <- recv_close ( s , status , buffer ) ,
21332119 { :ok , s } <- recv_ready ( s , status , buffer ) do
@@ -2139,6 +2125,9 @@ defmodule Postgrex.Protocol do
21392125
21402126 { :disconnect , _err , _s } = disconnect ->
21412127 disconnect
2128+
2129+ { :disconnect_and_retry , _err , _s } = disconnect ->
2130+ disconnect
21422131 end
21432132 end
21442133
@@ -2163,8 +2152,8 @@ defmodule Postgrex.Protocol do
21632152 msg_sync ( )
21642153 ]
21652154
2166- with :ok <- msg_send ( % { s | buffer: nil } , msgs , buffer ) ,
2167- { :ok , s , buffer } <- recv_bind ( s , status , buffer ) ,
2155+ with :ok <- msg_send ( % { s | buffer: nil } , msgs , buffer ) |> retry_disconnect ( s . postgres ) ,
2156+ { :ok , s , buffer } <- recv_bind ( s , status , buffer ) |> retry_disconnect ( s . postgres ) ,
21682157 { :ok , result , s , buffer } <- recv_execute ( s , status , query , buffer ) ,
21692158 { :ok , s } <- recv_ready ( s , status , buffer ) do
21702159 { :ok , query , result , s }
@@ -2177,6 +2166,9 @@ defmodule Postgrex.Protocol do
21772166
21782167 { :disconnect , _err , _s } = disconnect ->
21792168 disconnect
2169+
2170+ { :disconnect_and_retry , _err , _s } = disconnect ->
2171+ disconnect
21802172 end
21812173 end
21822174
@@ -2879,8 +2871,8 @@ defmodule Postgrex.Protocol do
28792871 % { connection_id: connection_id } = s
28802872 { :ok , % Postgrex.Result { command: :close , connection_id: connection_id } , s }
28812873 else
2882- { :disconnect , _err , _s } = disconnect ->
2883- disconnect
2874+ { :disconnect , _err , s } = disconnect ->
2875+ retry_disconnet ( disconnect , s . postgres )
28842876 end
28852877 end
28862878
@@ -2961,8 +2953,11 @@ defmodule Postgrex.Protocol do
29612953 :ok ->
29622954 recv_transaction ( s , status , buffer )
29632955
2964- { :disconnect , err , s } ->
2965- { :disconnect , err , s }
2956+ { :disconnect , % { reason: :closed } = err , s } when statement == "BEGIN" ->
2957+ { :disconnect_and_retry , err , s }
2958+
2959+ { :disconnect , _err , _s } = disconnect ->
2960+ disconnect
29662961 end
29672962 end
29682963
@@ -3440,10 +3435,13 @@ defmodule Postgrex.Protocol do
34403435 { :disconnect , err , % { s | buffer: buffer } }
34413436 end
34423437
3443- defp handle_disconnect_retry ( { :disconnect , % { reason: :closed } = err , s } ) ,
3438+ defp retry_disconnect ( result , :transaction ) , do: result
3439+ defp retry_disconnect ( result , { :transaction , _ } ) , do: result
3440+
3441+ defp retry_disconnect ( { :disconnect , % { reason: :closed } = err , s } , _ ) ,
34443442 do: { :disconnect_and_retry , err , s }
34453443
3446- defp handle_disconnect_retry ( other ) , do: other
3444+ defp retry_disconnect ( other , _ ) , do: other
34473445
34483446 defp sync_recv ( s , status , buffer ) do
34493447 % { postgres: postgres , transactions: transactions } = s
0 commit comments