diff options
-rw-r--r-- | src/ranch_conns_sup.erl | 2 | ||||
-rw-r--r-- | test/acceptor_SUITE.erl | 15 | ||||
-rw-r--r-- | test/remove_conn_and_wait_protocol.erl | 6 |
3 files changed, 20 insertions, 3 deletions
diff --git a/src/ranch_conns_sup.erl b/src/ranch_conns_sup.erl index fe2237a..d19405b 100644 --- a/src/ranch_conns_sup.erl +++ b/src/ranch_conns_sup.erl @@ -145,7 +145,7 @@ loop(State=#state{parent=Parent, ref=Ref, conn_type=ConnType, case put(Pid, removed) of active -> loop(State, CurConns - 1, NbChildren, Sleepers); - remove -> + removed -> loop(State, CurConns, NbChildren, Sleepers); undefined -> _ = erase(Pid), diff --git a/test/acceptor_SUITE.erl b/test/acceptor_SUITE.erl index 7deecbb..3c13d20 100644 --- a/test/acceptor_SUITE.erl +++ b/test/acceptor_SUITE.erl @@ -63,6 +63,7 @@ groups() -> ]}, {misc, [ misc_bad_transport, misc_bad_transport_options, + misc_repeated_remove, misc_info, misc_info_embedded, misc_opts_logger, @@ -291,6 +292,20 @@ misc_opts_logger(_) -> warning(Format, Args) -> misc_opts_logger ! {warning, Format, Args}. +misc_repeated_remove(_) -> + doc("Ensure repeated removal of connection does not crash the connection supervisor."), + Name = name(), + {ok, _} = ranch:start_listener(Name, + ranch_tcp, #{}, + remove_conn_and_wait_protocol, [{remove, 5, 0}]), + Port = ranch:get_port(Name), + ConnsSup = ranch_server:get_connections_sup(Name), + {ok, _} = gen_tcp:connect("localhost", Port, [binary, {active, false}, {packet, raw}]), + timer:sleep(1000), + ConnsSup = ranch_server:get_connections_sup(Name), + true = erlang:is_process_alive(ConnsSup), + ok = ranch:stop_listener(Name). + misc_wait_for_connections(_) -> doc("Ensure wait for connections works."), Name = name(), diff --git a/test/remove_conn_and_wait_protocol.erl b/test/remove_conn_and_wait_protocol.erl index 59cedfc..caac41e 100644 --- a/test/remove_conn_and_wait_protocol.erl +++ b/test/remove_conn_and_wait_protocol.erl @@ -10,10 +10,12 @@ start_link(Ref, _, _, [{remove, MaybeRemove, Timeout}]) -> init(Ref, MaybeRemove, Timeout) -> {ok, _} = ranch:handshake(Ref), - case MaybeRemove of + _ = case MaybeRemove of true -> ranch:remove_connection(Ref); false -> - ok + ok; + N -> + [ranch:remove_connection(Ref) || _ <- lists:seq(1, N)] end, receive after Timeout -> ok end. |