commit: c765fcbe7e907dd5ac1f8b559bf65ab477dfe0f0
parent 1071632a501238b13593f68e2e4625e25ecd465f
Author: Mark Felder <feld@feld.me>
Date: Thu, 20 Jun 2024 14:03:22 -0400
Gun Connection Pool: successfully retry after reclaiming the pool
Diffstat:
3 files changed, 22 insertions(+), 12 deletions(-)
diff --git a/changelog.d/gun_pool4.fix b/changelog.d/gun_pool4.fix
@@ -0,0 +1 @@
+Gun Connection Pool was not retrying to acquire a connection if the pool was full and stale connections were reclaimed
diff --git a/lib/pleroma/gun/connection_pool/worker_supervisor.ex b/lib/pleroma/gun/connection_pool/worker_supervisor.ex
@@ -5,6 +5,9 @@
defmodule Pleroma.Gun.ConnectionPool.WorkerSupervisor do
@moduledoc "Supervisor for pool workers. Does not do anything except enforce max connection limit"
+ alias Pleroma.Config
+ alias Pleroma.Gun.ConnectionPool.Worker
+
use DynamicSupervisor
def start_link(opts) do
@@ -14,21 +17,28 @@ defmodule Pleroma.Gun.ConnectionPool.WorkerSupervisor do
def init(_opts) do
DynamicSupervisor.init(
strategy: :one_for_one,
- max_children: Pleroma.Config.get([:connections_pool, :max_connections])
+ max_children: Config.get([:connections_pool, :max_connections])
)
end
- def start_worker(opts, last_attempt \\ false) do
- case DynamicSupervisor.start_child(__MODULE__, {Pleroma.Gun.ConnectionPool.Worker, opts}) do
+ def start_worker(opts, last_attempt \\ false)
+
+ def start_worker(opts, true) do
+ case DynamicSupervisor.start_child(__MODULE__, {Worker, opts}) do
+ {:error, :max_children} ->
+ :telemetry.execute([:pleroma, :connection_pool, :provision_failure], %{opts: opts})
+ {:error, :pool_full}
+
+ res ->
+ res
+ end
+ end
+
+ def start_worker(opts, false) do
+ case DynamicSupervisor.start_child(__MODULE__, {Worker, opts}) do
{:error, :max_children} ->
- funs = [fn -> last_attempt end, fn -> match?(:error, free_pool()) end]
-
- if Enum.any?(funs, fn fun -> fun.() end) do
- :telemetry.execute([:pleroma, :connection_pool, :provision_failure], %{opts: opts})
- {:error, :pool_full}
- else
- start_worker(opts, true)
- end
+ spawn(fn -> free_pool() end)
+ start_worker(opts, true)
res ->
res
diff --git a/test/pleroma/gun/connection_pool_test.exs b/test/pleroma/gun/connection_pool_test.exs
@@ -46,7 +46,6 @@ defmodule Pleroma.Gun.ConnectionPoolTest do
end
end
- @tag :erratic
test "connection limit is respected with concurrent requests" do
clear_config([:connections_pool, :max_connections]) do
clear_config([:connections_pool, :max_connections], 1)