Skip to content

Commit 751a67f

Browse files
committed
Ensure new connections in pool are updated
1 parent 21fc1d2 commit 751a67f

File tree

4 files changed

+14
-3
lines changed

4 files changed

+14
-3
lines changed

lib/adapters/postgres.ex

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ defmodule SQL.Adapters.Postgres do
1414
@ssl <<8::32, 80877103::32>>
1515

1616
def start(state) do
17-
{:ok, spawn_link(fn -> init(state) end)}
17+
pid = spawn_link(fn -> init(state) end)
18+
case :persistent_term.get(state.name, nil) do
19+
nil -> {:ok, pid}
20+
pool -> {:persistent_term.put(state.name, :erlang.setelement(state.scheduler_id, pool, pid)), pid}
21+
end
1822
end
1923

2024
defp to_iodata({:in, m, [{:not, _, left}, {:binding, _, [idx]}]}, format, case, acc) do

lib/application.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ defmodule SQL.Application do
1414
for {name, opts} <- pools do
1515
pid = Process.whereis(name)
1616
children = Supervisor.which_children(pid)
17-
pids = Enum.map(children, fn {_id, pid, _type, _mod} -> pid end)
17+
pids = Enum.reverse(Enum.map(children, fn {_id, pid, _type, _mod} -> pid end))
1818
:persistent_term.put(name, List.to_tuple(pids))
1919
:persistent_term.put({name, :oids}, Mix.Tasks.Sql.Get.oids({name, Map.new(opts)}))
2020
# :persistent_term.put({name, :types}, {Mix.Tasks.Sql.Get.get(key), Mix.Tasks.Sql.Get.columns(key), Mix.Tasks.Sql.Get.enums(key), Mix.Tasks.Sql.Get.oids(key), Mix.Tasks.Sql.Get.functions(key)})

lib/pool.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ defmodule SQL.Pool do
1919
for n <- 1..:erlang.system_info(:schedulers_online) do
2020
%{
2121
id: {:conn, n},
22-
start: {state.adapter, :start, [struct(state, scheduler_id: n+1, label: :"#{state.name}_#{n}")]},
22+
start: {state.adapter, :start, [struct(state, scheduler_id: n, label: :"#{state.name}_#{n}")]},
2323
restart: :permanent,
2424
shutdown: 5000,
2525
type: :worker,

test/integration/postgres_test.exs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,4 +162,11 @@ defmodule SQL.Integration.PostgresTest do
162162
Task.Supervisor.async_nolink(SQL.TaskSupervisor, fun)
163163
assert_receive ^state
164164
end
165+
166+
test "connection pool is self healing" do
167+
conn = elem(:persistent_term.get(:default), 0)
168+
Process.exit(conn, :shutdown)
169+
Process.sleep(50)
170+
refute elem(:persistent_term.get(:default), 0) == conn
171+
end
165172
end

0 commit comments

Comments
 (0)