diff options
author | href <href+git-pleroma@random.sh> | 2020-09-05 07:30:49 +0000 |
---|---|---|
committer | href <href+git-pleroma@random.sh> | 2020-09-05 07:30:49 +0000 |
commit | 6f45866724a620beb403fdafd87a04d90e8dc9c2 (patch) | |
tree | 8971cc31af16274fd3f3a1d4278cb7293f3d595c | |
parent | Fix decrement after max_retries been reached + telemetry events (diff) | |
parent | Fix 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.ex | 33 |
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 |