summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Bracco <href@random.sh>2020-09-08 11:59:27 +0200
committerJordan Bracco <href@random.sh>2020-09-08 12:03:25 +0200
commitd81be41024569330f296fc472e24198d7499ba78 (patch)
tree3677b0eeac8aa3706f7a3163ded18bd087759053
parentSentinel processes - ensure counter is always decremented (diff)
Split do_limit
-rw-r--r--lib/concurrent_limiter.ex40
1 files changed, 24 insertions, 16 deletions
diff --git a/lib/concurrent_limiter.ex b/lib/concurrent_limiter.ex
index d1be6e6..9450fc3 100644
--- a/lib/concurrent_limiter.ex
+++ b/lib/concurrent_limiter.ex
@@ -106,14 +106,7 @@ defmodule ConcurrentLimiter do
limiter: name
})
- mon = sentinel_start(sentinel, ref, name)
-
- try do
- fun.()
- after
- dec(ref, name)
- sentinel_stop(mon)
- end
+ run(sentinel, ref, name, fun)
counter > max ->
:telemetry.execute([:concurrent_limiter, :overload], %{counter: counter}, %{
@@ -157,12 +150,7 @@ defmodule ConcurrentLimiter do
retries: retries + 1
})
- mon = sentinel_start(sentinel, ref, name)
- wait = Keyword.get(opts, :timeout) || wait
- Process.sleep(wait)
- dec(ref, name)
- sentinel_stop(mon)
- do_limit(name, fun, opts, retries + 1)
+ wait(sentinel, ref, name, fun, opts, wait, retries)
end
end
@@ -174,6 +162,26 @@ defmodule ConcurrentLimiter do
:atomics.sub_get(ref, 1, 1)
end
+ defp run(sentinel, ref, name, fun) do
+ mon = sentinel_start(sentinel, ref, name)
+
+ try do
+ fun.()
+ after
+ dec(ref, name)
+ sentinel_stop(mon)
+ end
+ end
+
+ defp wait(sentinel, ref, name, fun, opts, wait, retries) do
+ mon = sentinel_start(sentinel, ref, name)
+ wait = Keyword.get(opts, :timeout) || wait
+ Process.sleep(wait)
+ dec(ref, name)
+ sentinel_stop(mon)
+ do_limit(name, fun, opts, retries + 1)
+ end
+
defp prefix_name(suffix), do: Module.concat(__MODULE__, suffix)
defp defined?(name) do
@@ -194,14 +202,14 @@ defmodule ConcurrentLimiter do
defp sentinel_start(_, _, _), do: nil
defp sentinel_stop(pid) when is_pid(pid) do
- Process.exit(pid, :normal)
+ Process.exit(pid, :kill)
end
defp sentinel_stop(_), do: nil
defp sentinel_run(ref, name, pid, mon) do
receive do
- {:DOWN, ^mon, _, ^pid, reason} ->
+ {:DOWN, ^mon, _, ^pid, _reason} ->
dec(ref, name)
end
end