Skip to content

Commit ac018bf

Browse files
lower level
1 parent 617a953 commit ac018bf

File tree

1 file changed

+44
-46
lines changed

1 file changed

+44
-46
lines changed

lib/postgrex/protocol.ex

Lines changed: 44 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)