diff options
author | Jordan Bracco <href@random.sh> | 2020-09-01 19:41:13 +0200 |
---|---|---|
committer | Jordan Bracco <href@random.sh> | 2020-09-05 09:33:25 +0200 |
commit | 3aa46650e23afcad9fc22f0782d05045f3ddbac3 (patch) | |
tree | 5b689217ccad0c2fd6065e0a1f28fbcf5395ad8c | |
parent | Merge branch 'fix/trap-exits' into 'master' (diff) |
Fix behaviour of max_waiting = 0 with max_running = 1
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | lib/concurrent_limiter.ex | 7 | ||||
-rw-r--r-- | test/concurrent_limiter_test.exs | 11 |
3 files changed, 19 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index b399b8e..daa5288 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Fixed - Decrement counter when max retries has been reached. +- Fixes behaviour of `max_waiting = 0` with `max_size = 1`. ## [0.1.0] - 2020-05-16 diff --git a/lib/concurrent_limiter.ex b/lib/concurrent_limiter.ex index 4a367ea..f871276 100644 --- a/lib/concurrent_limiter.ex +++ b/lib/concurrent_limiter.ex @@ -127,6 +127,13 @@ defmodule ConcurrentLimiter do scope: "max" }) + max_waiting == 0 -> + :telemetry.execute([:concurrent_limiter, :overload], %{counter: counter}, %{limiter: name, scope: "max"}) + dec(ref, name) + {:error, :overload} + + counter > max -> + :telemetry.execute([:concurrent_limiter, :overload], %{counter: counter}, %{limiter: name, scope: "max"}) dec(ref, name) {:error, :overload} diff --git a/test/concurrent_limiter_test.exs b/test/concurrent_limiter_test.exs index 83e9981..74c9590 100644 --- a/test/concurrent_limiter_test.exs +++ b/test/concurrent_limiter_test.exs @@ -6,6 +6,17 @@ defmodule ConcurrentLimiterTest do use ExUnit.Case doctest ConcurrentLimiter + test "limited to one" do + name = "l1" + ConcurrentLimiter.new(name, 1, 0, max_retries: 0) + endless = fn() -> :timer.sleep(10000) end + spawn(fn() -> ConcurrentLimiter.limit(name, endless) end) + :timer.sleep(5) + {:error, :overload} = ConcurrentLimiter.limit(name, endless) + {:error, :overload} = ConcurrentLimiter.limit(name, endless) + {:error, :overload} = ConcurrentLimiter.limit(name, endless) + end + test "limiter is atomic" do name = "test" ConcurrentLimiter.new(name, 2, 2) |