summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhref <href+git-pleroma@random.sh>2020-09-05 07:30:49 +0000
committerhref <href+git-pleroma@random.sh>2020-09-05 07:30:49 +0000
commit6f45866724a620beb403fdafd87a04d90e8dc9c2 (patch)
tree8971cc31af16274fd3f3a1d4278cb7293f3d595c
parentFix decrement after max_retries been reached + telemetry events (diff)
parentFix counters not decrementing when the process is exited (diff)
Merge branch 'fix/trap-exits' into 'master'
Fix counters not decrementing when the process is exited See merge request pleroma/elixir-libraries/concurrent_limiter!1
-rw-r--r--lib/concurrent_limiter.ex33
1 files changed, 29 insertions, 4 deletions
diff --git a/lib/concurrent_limiter.ex b/lib/concurrent_limiter.ex
index e7b6b55..4a367ea 100644
--- a/lib/concurrent_limiter.ex
+++ b/lib/concurrent_limiter.ex
@@ -101,25 +101,50 @@ defmodule ConcurrentLimiter do
cond do
counter <= max_running ->
- :telemetry.execute([:concurrent_limiter, :execution], %{counter: counter}, %{limiter: name})
+ :telemetry.execute([:concurrent_limiter, :execution], %{counter: counter}, %{
+ limiter: name
+ })
+
+ Process.flag(:trap_exit, true)
+
try do
fun.()
after
dec(ref, name)
+ Process.flag(:trap_exit, false)
+
+ receive do
+ {:EXIT, _, reason} ->
+ Process.exit(self(), reason)
+ after
+ 0 -> :noop
+ end
end
counter > max ->
- :telemetry.execute([:concurrent_limiter, :overload], %{counter: counter}, %{limiter: name, scope: "max"})
+ :telemetry.execute([:concurrent_limiter, :overload], %{counter: counter}, %{
+ limiter: name,
+ scope: "max"
+ })
+
dec(ref, name)
{:error, :overload}
retries + 1 > max_retries ->
- :telemetry.execute([:concurrent_limiter, :max_retries], %{counter: counter}, %{limiter: name, retries: retries + 1})
+ :telemetry.execute([:concurrent_limiter, :max_retries], %{counter: counter}, %{
+ limiter: name,
+ retries: retries + 1
+ })
+
dec(ref, name)
{:error, :overload}
counter > max_running ->
- :telemetry.execute([:concurrent_limiter, :wait], %{counter: counter}, %{limiter: name, retries: retries + 1})
+ :telemetry.execute([:concurrent_limiter, :wait], %{counter: counter}, %{
+ limiter: name,
+ retries: retries + 1
+ })
+
wait(ref, name, fun, wait, opts, retries + 1)
end
end