aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2018-04-10 10:47:02 +0200
committerLoïc Hoguin <[email protected]>2018-04-10 10:47:02 +0200
commitab4bd965e3b2a704d34a335c3158e7317606d1a2 (patch)
tree67b6159781c5aa51e357366cf0606487393a30ff
parentfa608621bfedbb981657d2d09e2b321dddc0ad8e (diff)
downloadranch-ab4bd965e3b2a704d34a335c3158e7317606d1a2.tar.gz
ranch-ab4bd965e3b2a704d34a335c3158e7317606d1a2.tar.bz2
ranch-ab4bd965e3b2a704d34a335c3158e7317606d1a2.zip
Prevent ranch_conns_sup from stopping on unexpected messages
-rw-r--r--src/ranch_conns_sup.erl3
-rw-r--r--test/acceptor_SUITE.erl25
2 files changed, 26 insertions, 2 deletions
diff --git a/src/ranch_conns_sup.erl b/src/ranch_conns_sup.erl
index 07c9212..14c2481 100644
--- a/src/ranch_conns_sup.erl
+++ b/src/ranch_conns_sup.erl
@@ -213,7 +213,8 @@ loop(State=#state{parent=Parent, ref=Ref, conn_type=ConnType,
Msg ->
error_logger:error_msg(
"Ranch listener ~p received unexpected message ~p~n",
- [Ref, Msg])
+ [Ref, Msg]),
+ loop(State, CurConns, NbChildren, Sleepers)
end.
shoot(State=#state{ref=Ref, transport=Transport, ack_timeout=AckTimeout, max_conns=MaxConns},
diff --git a/test/acceptor_SUITE.erl b/test/acceptor_SUITE.erl
index 285f438..f826f54 100644
--- a/test/acceptor_SUITE.erl
+++ b/test/acceptor_SUITE.erl
@@ -65,7 +65,8 @@ groups() ->
supervisor_clean_restart,
supervisor_conns_alive,
supervisor_protocol_start_link_crash,
- supervisor_server_recover_state
+ supervisor_server_recover_state,
+ supervisor_unexpected_message
]}].
%% misc.
@@ -898,6 +899,28 @@ do_supervisor_server_recover_state(_) ->
_ = erlang:trace(all, false, [all]),
ok = clean_traces().
+supervisor_unexpected_message(_) ->
+ doc("Ensure the connections supervisor stays alive when it receives "
+ "an unexpected message."),
+ Name = name(),
+ {ok, ListenerPid} = ranch:start_listener(Name, ranch_tcp, [], echo_protocol, []),
+ Port = ranch:get_port(Name),
+ {ok, Socket} = gen_tcp:connect("localhost", Port, [binary, {active, false}, {packet, raw}]),
+ ok = gen_tcp:send(Socket, <<"TCP Ranch is working!">>),
+ {ok, <<"TCP Ranch is working!">>} = gen_tcp:recv(Socket, 21, 1000),
+ %% Send the unexpected message to ranch_conns_sup.
+ Procs = supervisor:which_children(ListenerPid),
+ {_, ConnsSup, _, _} = lists:keyfind(ranch_conns_sup, 1, Procs),
+ ConnsSup ! hello,
+ %% Connection is still up.
+ ok = gen_tcp:send(Socket, <<"TCP Ranch is working!">>),
+ {ok, <<"TCP Ranch is working!">>} = gen_tcp:recv(Socket, 21, 1000),
+ ok = ranch:stop_listener(Name),
+ {error, closed} = gen_tcp:recv(Socket, 0, 1000),
+ %% Make sure the listener stopped.
+ {'EXIT', _} = begin catch ranch:get_port(Name) end,
+ ok.
+
%% Utility functions.
connect_loop(_, 0, _) ->