- @enforcer_key "enforcer"
- defp enforce_pool_limits() do
- max_connections = Pleroma.Config.get([:connections_pool, :max_connections])
-
- if Registry.count(@registry) >= max_connections do
- case Registry.lookup(@registry, @enforcer_key) do
- [] ->
- pid =
- spawn(fn ->
- {:ok, _pid} = Registry.register(@registry, @enforcer_key, nil)
-
- reclaim_max =
- [:connections_pool, :reclaim_multiplier]
- |> Pleroma.Config.get()
- |> Kernel.*(max_connections)
- |> round
- |> max(1)
-
- unused_conns =
- Registry.select(
- @registry,
- [
- {{:_, :"$1", {:_, :"$2", :"$3", :"$4"}}, [{:==, :"$2", []}],
- [{{:"$1", :"$3", :"$4"}}]}
- ]
- )
-
- case unused_conns do
- [] ->
- exit(:pool_full)
-
- unused_conns ->
- unused_conns
- |> Enum.sort(fn {_pid1, crf1, last_reference1},
- {_pid2, crf2, last_reference2} ->
- crf1 <= crf2 and last_reference1 <= last_reference2
- end)
- |> Enum.take(reclaim_max)
- |> Enum.each(fn {pid, _, _} -> GenServer.call(pid, :idle_close) end)
- end
- end)
-
- wait_for_enforcer_finish(pid)
-
- [{pid, _}] ->
- wait_for_enforcer_finish(pid)
- end
- else
- :ok
- end
- end
-
- defp wait_for_enforcer_finish(pid) do
- ref = Process.monitor(pid)
-
- receive do
- {:DOWN, ^ref, :process, ^pid, :pool_full} ->
- :error
-
- {:DOWN, ^ref, :process, ^pid, :normal} ->
- :ok
- end
- end
-
- defp get_gun_pid_from_worker(worker_pid) do