summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Felder <feld@feld.me>2024-06-20 14:03:22 -0400
committerMark Felder <feld@feld.me>2024-06-20 14:03:22 -0400
commitc765fcbe7e907dd5ac1f8b559bf65ab477dfe0f0 (patch)
tree51be39289cc9c81df0be17edde1087c8e08e4087
parent1071632a501238b13593f68e2e4625e25ecd465f (diff)
downloadpleroma-c765fcbe7e907dd5ac1f8b559bf65ab477dfe0f0.tar.gz
pleroma-c765fcbe7e907dd5ac1f8b559bf65ab477dfe0f0.zip
Gun Connection Pool: successfully retry after reclaiming the pool
-rw-r--r--changelog.d/gun_pool4.fix1
-rw-r--r--lib/pleroma/gun/connection_pool/worker_supervisor.ex32
-rw-r--r--test/pleroma/gun/connection_pool_test.exs1
3 files changed, 22 insertions, 12 deletions
diff --git a/changelog.d/gun_pool4.fix b/changelog.d/gun_pool4.fix
new file mode 100644
index 000000000..f68c1c970
--- /dev/null
+++ 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
index eb83962d8..dabb15b08 100644
--- 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
index e0c9e9904..f3670760d 100644
--- 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)