Browse Source

Make acceptors query the protocol opts on startup

This way, if a crash happens in one of them after a protocol options
upgrade has occured, the restarted acceptor will get the upgraded
options as expected, and not the initial ones.
Loïc Hoguin 12 years ago
parent
commit
7d52280c2e
4 changed files with 18 additions and 17 deletions
  1. 5 5
      src/ranch_acceptor.erl
  2. 10 10
      src/ranch_acceptors_sup.erl
  3. 1 1
      src/ranch_listener_sup.erl
  4. 2 1
      src/ranch_server.erl

+ 5 - 5
src/ranch_acceptor.erl

@@ -16,17 +16,17 @@
 -module(ranch_acceptor).
 -module(ranch_acceptor).
 
 
 %% API.
 %% API.
--export([start_link/7]).
+-export([start_link/6]).
 
 
 %% Internal.
 %% Internal.
 -export([acceptor/7]).
 -export([acceptor/7]).
 
 
 %% API.
 %% API.
 
 
--spec start_link(any(), inet:socket(), module(), module(), any(),
-	pid(), pid()) -> {ok, pid()}.
-start_link(Ref, LSocket, Transport, Protocol, Opts,
-		ListenerPid, ConnsSup) ->
+-spec start_link(any(), inet:socket(), module(), module(), pid(), pid())
+	-> {ok, pid()}.
+start_link(Ref, LSocket, Transport, Protocol, ListenerPid, ConnsSup) ->
+	{ok, Opts} = ranch_listener:get_protocol_options(ListenerPid),
 	Pid = spawn_link(?MODULE, acceptor,
 	Pid = spawn_link(?MODULE, acceptor,
 		[LSocket, Transport, Protocol, Opts, 1, ListenerPid, ConnsSup]),
 		[LSocket, Transport, Protocol, Opts, 1, ListenerPid, ConnsSup]),
 	ok = ranch_server:add_acceptor(Ref, Pid),
 	ok = ranch_server:add_acceptor(Ref, Pid),

+ 10 - 10
src/ranch_acceptors_sup.erl

@@ -17,7 +17,7 @@
 -behaviour(supervisor).
 -behaviour(supervisor).
 
 
 %% API.
 %% API.
--export([start_link/8]).
+-export([start_link/7]).
 
 
 %% supervisor.
 %% supervisor.
 -export([init/1]).
 -export([init/1]).
@@ -25,22 +25,22 @@
 %% API.
 %% API.
 
 
 -spec start_link(any(), non_neg_integer(), module(), any(),
 -spec start_link(any(), non_neg_integer(), module(), any(),
-	module(), any(), pid(), pid()) -> {ok, pid()}.
+	module(), pid(), pid()) -> {ok, pid()}.
 start_link(Ref, NbAcceptors, Transport, TransOpts,
 start_link(Ref, NbAcceptors, Transport, TransOpts,
-		Protocol, ProtoOpts, ListenerPid, ConnsPid) ->
+		Protocol, ListenerPid, ConnsPid) ->
 	supervisor:start_link(?MODULE, [Ref, NbAcceptors, Transport, TransOpts,
 	supervisor:start_link(?MODULE, [Ref, NbAcceptors, Transport, TransOpts,
-		Protocol, ProtoOpts, ListenerPid, ConnsPid]).
+		Protocol, ListenerPid, ConnsPid]).
 
 
 %% supervisor.
 %% supervisor.
 
 
 init([Ref, NbAcceptors, Transport, TransOpts,
 init([Ref, NbAcceptors, Transport, TransOpts,
-		Protocol, ProtoOpts, ListenerPid, ConnsPid]) ->
+		Protocol, ListenerPid, ConnsPid]) ->
 	{ok, LSocket} = Transport:listen(TransOpts),
 	{ok, LSocket} = Transport:listen(TransOpts),
 	{ok, {_, Port}} = Transport:sockname(LSocket),
 	{ok, {_, Port}} = Transport:sockname(LSocket),
 	ranch_listener:set_port(ListenerPid, Port),
 	ranch_listener:set_port(ListenerPid, Port),
-	Procs = [{{acceptor, self(), N}, {ranch_acceptor, start_link, [
-				Ref, LSocket, Transport, Protocol, ProtoOpts,
-				ListenerPid, ConnsPid
-      ]}, permanent, brutal_kill, worker, []}
-		|| N <- lists:seq(1, NbAcceptors)],
+	Procs = [
+		{{acceptor, self(), N}, {ranch_acceptor, start_link, [
+			Ref, LSocket, Transport, Protocol, ListenerPid, ConnsPid
+		]}, permanent, brutal_kill, worker, []}
+			|| N <- lists:seq(1, NbAcceptors)],
 	{ok, {{one_for_one, 10, 10}, Procs}}.
 	{ok, {{one_for_one, 10, 10}, Procs}}.

+ 1 - 1
src/ranch_listener_sup.erl

@@ -39,7 +39,7 @@ start_link(Ref, NbAcceptors, Transport, TransOpts, Protocol, ProtoOpts) ->
 	{ok, _PoolPid} = supervisor:start_child(SupPid,
 	{ok, _PoolPid} = supervisor:start_child(SupPid,
 		{ranch_acceptors_sup, {ranch_acceptors_sup, start_link, [
 		{ranch_acceptors_sup, {ranch_acceptors_sup, start_link, [
 			Ref, NbAcceptors, Transport, TransOpts,
 			Ref, NbAcceptors, Transport, TransOpts,
-			Protocol, ProtoOpts, ListenerPid, ConnsPid
+			Protocol, ListenerPid, ConnsPid
 		]}, permanent, 5000, supervisor, [ranch_acceptors_sup]}),
 		]}, permanent, 5000, supervisor, [ranch_acceptors_sup]}),
 	{ok, SupPid}.
 	{ok, SupPid}.
 
 

+ 2 - 1
src/ranch_server.erl

@@ -117,8 +117,9 @@ code_change(_OldVsn, State, _Extra) ->
 
 
 -spec remove_process(key(), reference(), pid(), Monitors)
 -spec remove_process(key(), reference(), pid(), Monitors)
 	-> Monitors when Monitors::monitors() .
 	-> Monitors when Monitors::monitors() .
-remove_process(Key = {listener, _}, MonitorRef, Pid, Monitors) ->
+remove_process(Key = {listener, Ref}, MonitorRef, Pid, Monitors) ->
 	true = ets:delete(?TAB, Key),
 	true = ets:delete(?TAB, Key),
+	true = ets:delete(?TAB, {acceptors, Ref}),
 	lists:keydelete({MonitorRef, Pid}, 1, Monitors);
 	lists:keydelete({MonitorRef, Pid}, 1, Monitors);
 remove_process(Key = {acceptors, _}, MonitorRef, Pid, Monitors) ->
 remove_process(Key = {acceptors, _}, MonitorRef, Pid, Monitors) ->
 	Acceptors = ets:lookup_element(?TAB, Key, 2),
 	Acceptors = ets:lookup_element(?TAB, Key, 2),