diff options
author | Jordan Bracco <href@random.sh> | 2020-05-16 12:17:40 +0200 |
---|---|---|
committer | Jordan Bracco <href@random.sh> | 2020-05-16 12:22:30 +0200 |
commit | 447b4c9a2e99a37c0d17e01e79d786f2c11590f5 (patch) | |
tree | 87202b1b8e9b09a46ad862a475af0664e5dd753a /test | |
parent | Remove ETS backend, add max_retries, add options to limit/3. (diff) |
Format and prepare for release
Diffstat (limited to 'test')
-rw-r--r-- | test/concurrent_limiter_test.exs | 53 | ||||
-rw-r--r-- | test/samples/multi_limiter.exs | 69 | ||||
-rw-r--r-- | test/samples/update_counter.exs | 33 |
3 files changed, 81 insertions, 74 deletions
diff --git a/test/concurrent_limiter_test.exs b/test/concurrent_limiter_test.exs index e1d281e..090417e 100644 --- a/test/concurrent_limiter_test.exs +++ b/test/concurrent_limiter_test.exs @@ -1,42 +1,39 @@ +# ConcurrentLimiter: A concurrency limiter. +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: LGPL-3.0-only + defmodule ConcurrentLimiterTest do use ExUnit.Case doctest ConcurrentLimiter - test "limiter ets is atomic" do - name = "test1" + test "limiter is atomic" do + name = "test" ConcurrentLimiter.new(name, 2, 2) - atomic_test(name) - end - - test "limiter atomics is atomic" do - name = "test2" - ConcurrentLimiter.new(name, 2, 2, backend: :atomics) - atomic_test(name) - end - - defp atomic_test(name) do self = self() - sleepy = fn sleep -> - case ConcurrentLimiter.limit(name, fn -> - send(self, :ok) - Process.sleep(sleep) - :ok - end) do - :ok -> :ok - other -> send(self, other) - end - end - - spawn_link(fn -> sleepy.(500) end) - spawn_link(fn -> sleepy.(500) end) - spawn_link(fn -> sleepy.(500) end) - spawn_link(fn -> sleepy.(500) end) - spawn_link(fn -> sleepy.(500) end) + spawn_link(fn -> sleepy(name, 500) end) + spawn_link(fn -> sleepy(name, 500) end) + spawn_link(fn -> sleepy(name, 500) end) + spawn_link(fn -> sleepy(name, 500) end) + spawn_link(fn -> sleepy(name, 500) end) assert_receive :ok, 2000 assert_receive :ok, 2000 assert_receive {:error, :overload}, 2000 assert_receive :ok, 2000 assert_receive :ok, 2000 end + + defp sleepy(duration) do + result = + ConcurrentLimiter.limit(name, fn -> + send(self, :ok) + Process.sleep(sleep) + :ok + end) + + case result do + :ok -> :ok + other -> send(self, other) + end + end end diff --git a/test/samples/multi_limiter.exs b/test/samples/multi_limiter.exs index f56cb6c..0936773 100644 --- a/test/samples/multi_limiter.exs +++ b/test/samples/multi_limiter.exs @@ -1,49 +1,54 @@ infinite = 1_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000 -parallel = case Integer.parse(System.get_env("PARALLEL", "")) do - {int, _} -> int - _ -> System.schedulers_online()/2 -end -multi_count = case Integer.parse(System.get_env("MULTI", "")) do - {int, _} -> int - _ -> parallel -end +parallel = + case Integer.parse(System.get_env("PARALLEL", "")) do + {int, _} -> int + _ -> System.schedulers_online() / 2 + end + +multi_count = + case Integer.parse(System.get_env("MULTI", "")) do + {int, _} -> int + _ -> parallel + end -names = fn(prefix) -> +names = fn prefix -> for i <- 1..multi_count do Module.concat(MultiConcurrentLimiterBenchmark, "#{prefix}#{i}") end end +bench_unique = + for name <- names.("u") do + ConcurrentLimiter.new(name, infinite, 0, backend: {:ets, name, []}) + name + end -bench_unique = for name <- names.("u") do - ConcurrentLimiter.new(name, infinite, 0, backend: {:ets, name, []}) - name -end - -IO.inspect(bench_unique) - -bench_atomics = for name <- names.("a") do - ConcurrentLimiter.new(name, infinite, 0, backend: :atomics) - name -end +bench_atomics = + for name <- names.("a") do + ConcurrentLimiter.new(name, infinite, 0, backend: :atomics) + name + end -bench_shared = for name <- names.("s") do - ConcurrentLimiter.new(name, infinite, 0, backend: {:ets, ConcurrentLimiterTest, []}) - name -end +bench_shared = + for name <- names.("s") do + ConcurrentLimiter.new(name, infinite, 0, backend: {:ets, ConcurrentLimiterTest, []}) + name + end rw = [{:read_concurrency, true}, {:write_concurrency, true}] -bench_unique_rw = for name <- names.("u_rw") do - ConcurrentLimiter.new(name, infinite, 0, backend: {:ets, name, rw}) - name -end +bench_unique_rw = + for name <- names.("u_rw") do + ConcurrentLimiter.new(name, infinite, 0, backend: {:ets, name, rw}) + name + end -bench_shared_rw = for name <- names.("s_rw") do - ConcurrentLimiter.new(name, infinite, 0, backend: {:ets, ConcurrentLimiterTestRW, rw}) - name -end +bench_shared_rw = + for name <- names.("s_rw") do + ConcurrentLimiter.new(name, infinite, 0, backend: {:ets, ConcurrentLimiterTestRW, rw}) + name + end multiple = %{ "ConcurrentLimiter.limit/2 unique ets" => fn -> diff --git a/test/samples/update_counter.exs b/test/samples/update_counter.exs index 6310c57..1d8e837 100644 --- a/test/samples/update_counter.exs +++ b/test/samples/update_counter.exs @@ -1,20 +1,25 @@ :ets.new(:limiter_bench, [:public, :named_table]) -:ets.new(:limiter_bench_concurrent, [:public, :named_table, {:read_concurrency, false}, {:write_concurrency, true}]) + +:ets.new(:limiter_bench_concurrent, [ + :public, + :named_table, + {:read_concurrency, false}, + {:write_concurrency, true} +]) + atomics = :atomics.new(1, []) -update_counter = - %{ - "ets:update_counter" => fn -> - :ets.update_counter(:limiter_bench, "bench", {2, 1}, {"bench", 0}) - end, - "ets:update_counter concurrent" => fn -> - :ets.update_counter(:limiter_bench, "bench", {2, 1}, {"bench", 0}) - end, - "atomics:add_get" => fn -> - :atomics.add_get(atomics, 1, 1) - end, - } +update_counter = %{ + "ets:update_counter" => fn -> + :ets.update_counter(:limiter_bench, "bench", {2, 1}, {"bench", 0}) + end, + "ets:update_counter concurrent" => fn -> + :ets.update_counter(:limiter_bench, "bench", {2, 1}, {"bench", 0}) + end, + "atomics:add_get" => fn -> + :atomics.add_get(atomics, 1, 1) + end +} Benchee.run(update_counter, parallel: 1) Benchee.run(update_counter, parallel: System.schedulers_online()) - |