Skip to content
Snippets Groups Projects
Commit 6a0f2bdf authored by href's avatar href Committed by rinpatch
Browse files

Ensure connections error get known by the caller

parent 46dd276d
No related branches found
No related tags found
No related merge requests found
......@@ -16,7 +16,7 @@ def get_conn(uri, opts) do
case Registry.lookup(@registry, key) do
# The key has already been registered, but connection is not up yet
[{worker_pid, nil}] ->
get_gun_pid_from_worker(worker_pid)
get_gun_pid_from_worker(worker_pid, true)
[{worker_pid, {gun_pid, _used_by, _crf, _last_reference}}] ->
GenServer.cast(worker_pid, {:add_client, self(), false})
......@@ -27,13 +27,11 @@ def get_conn(uri, opts) do
# so we open the connection in the process directly and send it's pid back
# We trust gun to handle timeouts by itself
case WorkerSupervisor.start_worker([key, uri, opts, self()]) do
{:ok, _worker_pid} ->
receive do
{:conn_pid, pid} -> {:ok, pid}
end
{:ok, worker_pid} ->
get_gun_pid_from_worker(worker_pid, false)
{:error, {:already_started, worker_pid}} ->
get_gun_pid_from_worker(worker_pid)
get_gun_pid_from_worker(worker_pid, true)
err ->
err
......@@ -41,17 +39,21 @@ def get_conn(uri, opts) do
end
end
defp get_gun_pid_from_worker(worker_pid) do
defp get_gun_pid_from_worker(worker_pid, register) do
# GenServer.call will block the process for timeout length if
# the server crashes on startup (which will happen if gun fails to connect)
# so instead we use cast + monitor
ref = Process.monitor(worker_pid)
GenServer.cast(worker_pid, {:add_client, self(), true})
if register, do: GenServer.cast(worker_pid, {:add_client, self(), true})
receive do
{:conn_pid, pid} -> {:ok, pid}
{:DOWN, ^ref, :process, ^worker_pid, reason} -> reason
{:conn_pid, pid} ->
Process.demonitor(ref)
{:ok, pid}
{:DOWN, ^ref, :process, ^worker_pid, reason} ->
{:error, reason}
end
end
......
......@@ -30,7 +30,8 @@ def handle_continue({:connect, [key, uri, opts, client_pid]}, _) do
%{key: key, timer: nil, client_monitors: %{client_pid => Process.monitor(client_pid)}},
:hibernate}
else
err -> {:stop, err}
err ->
{:stop, err, nil}
end
end
......
......@@ -14,7 +14,7 @@ defmodule Pleroma.HTTP.AdapterHelper.Gun do
connect_timeout: 5_000,
domain_lookup_timeout: 5_000,
tls_handshake_timeout: 5_000,
retry: 1,
retry: 0,
retry_timeout: 1000,
await_up_timeout: 5_000
]
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment