From ab4bd965e3b2a704d34a335c3158e7317606d1a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Tue, 10 Apr 2018 10:47:02 +0200 Subject: Prevent ranch_conns_sup from stopping on unexpected messages --- src/ranch_conns_sup.erl | 3 ++- test/acceptor_SUITE.erl | 25 ++++++++++++++++++++++++- 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, _) -> -- cgit v1.2.3