aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorj.uhlig <[email protected]>2018-05-10 13:04:57 +0200
committerLoïc Hoguin <[email protected]>2018-05-17 15:33:29 +0200
commite381ccccdff196ded3624162bc106aff09885e60 (patch)
tree296461b8b64c8f6bac0e77c4632fe8d747a70cb1 /src
parent03219f30c9f46012148297aad718805a5dc27991 (diff)
downloadranch-e381ccccdff196ded3624162bc106aff09885e60.tar.gz
ranch-e381ccccdff196ded3624162bc106aff09885e60.tar.bz2
ranch-e381ccccdff196ded3624162bc106aff09885e60.zip
Add a function to wait for number of connections
LH: Reworked validation style and added a -dialyzer attribute to acceptor_SUITE to silence expected errors.
Diffstat (limited to 'src')
-rw-r--r--src/ranch.erl47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/ranch.erl b/src/ranch.erl
index 5af4b74..9cd3809 100644
--- a/src/ranch.erl
+++ b/src/ranch.erl
@@ -35,6 +35,8 @@
-export([info/0]).
-export([info/1]).
-export([procs/2]).
+-export([wait_for_connections/3]).
+-export([wait_for_connections/4]).
-export([filter_options/3]).
-export([set_option_default/3]).
-export([require/1]).
@@ -272,6 +274,51 @@ procs1(Ref, Sup) ->
[]
end.
+-spec wait_for_connections
+ (ref(), '>' | '>=' | '==' | '=<', non_neg_integer()) -> ok;
+ (ref(), '<', pos_integer()) -> ok.
+wait_for_connections(Ref, Op, NumConns) ->
+ wait_for_connections(Ref, Op, NumConns, 1000).
+
+-spec wait_for_connections
+ (ref(), '>' | '>=' | '==' | '=<', non_neg_integer(), non_neg_integer()) -> ok;
+ (ref(), '<', pos_integer(), non_neg_integer()) -> ok.
+wait_for_connections(Ref, Op, NumConns, Interval) ->
+ validate_op(Op, NumConns),
+ validate_num_conns(NumConns),
+ validate_interval(Interval),
+ wait_for_connections_loop(Ref, Op, NumConns, Interval).
+
+validate_op('>', _) -> ok;
+validate_op('>=', _) -> ok;
+validate_op('==', _) -> ok;
+validate_op('=<', _) -> ok;
+validate_op('<', NumConns) when NumConns > 0 -> ok;
+validate_op(_, _) -> error(badarg).
+
+validate_num_conns(NumConns) when is_integer(NumConns), NumConns >= 0 -> ok;
+validate_num_conns(_) -> error(badarg).
+
+validate_interval(Interval) when is_integer(Interval), Interval >= 0 -> ok;
+validate_interval(_) -> error(badarg).
+
+wait_for_connections_loop(Ref, Op, NumConns, Interval) ->
+ CurConns = try
+ ConnsSup = ranch_server:get_connections_sup(Ref),
+ proplists:get_value(active, supervisor:count_children(ConnsSup))
+ catch _:_ ->
+ 0
+ end,
+ case erlang:Op(CurConns, NumConns) of
+ true ->
+ ok;
+ false when Interval > 0 ->
+ wait_for_connections_loop(Ref, Op, NumConns, Interval);
+ false ->
+ timer:sleep(Interval),
+ wait_for_connections_loop(Ref, Op, NumConns, Interval)
+ end.
+
-spec filter_options([inet | inet6 | {atom(), any()} | {raw, any(), any(), any()}],
[atom()], Acc) -> Acc when Acc :: [any()].
filter_options(UserOptions, DisallowedKeys, DefaultOptions) ->