summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Bracco <href@random.sh>2020-09-01 19:41:13 +0200
committerJordan Bracco <href@random.sh>2020-09-05 09:33:25 +0200
commit3aa46650e23afcad9fc22f0782d05045f3ddbac3 (patch)
tree5b689217ccad0c2fd6065e0a1f28fbcf5395ad8c
parentMerge branch 'fix/trap-exits' into 'master' (diff)
Fix behaviour of max_waiting = 0 with max_running = 1
-rw-r--r--CHANGELOG.md1
-rw-r--r--lib/concurrent_limiter.ex7
-rw-r--r--test/concurrent_limiter_test.exs11
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)