Browse Source

Fix repeated removal of connections

Due to a typo, repeated calls to ranch:remove_connection/1 from a
worker process would crash the respective ranch_conns_sup.
juhlig 6 years ago
parent
commit
dabf62792c
3 changed files with 20 additions and 3 deletions
  1. 1 1
      src/ranch_conns_sup.erl
  2. 15 0
      test/acceptor_SUITE.erl
  3. 4 2
      test/remove_conn_and_wait_protocol.erl

+ 1 - 1
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),

+ 15 - 0
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(),

+ 4 - 2
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.