diff options
author | Andrew Majorov <[email protected]> | 2012-11-01 16:50:47 +0400 |
---|---|---|
committer | Andrew Majorov <[email protected]> | 2012-12-21 00:05:12 +0400 |
commit | 8dad1451dd6e41f30741ac7554da238aa63c163a (patch) | |
tree | 0be82b920136d309b0ca4fafb17d490ab048ae24 /src/ranch_server.erl | |
parent | 7f4261d1d83dde90be93d3615693b44969f6b446 (diff) | |
download | ranch-8dad1451dd6e41f30741ac7554da238aa63c163a.tar.gz ranch-8dad1451dd6e41f30741ac7554da238aa63c163a.tar.bz2 ranch-8dad1451dd6e41f30741ac7554da238aa63c163a.zip |
Make listener supervisor failures less painful
Two general issues were addressed. The first one is the issue with
statically defined pids passed into childspecs. This issue prevents
regular supervisor' children restarts in the case of someone's
failure.
The second one is the not quite appropriate restart strategy.
Changed to rest_for_one which in pair with previous fixes assures
that live connections will not die in the case of partial failure.
Among possible failures are listening socket shutdown or frequent
accept errors.
Diffstat (limited to 'src/ranch_server.erl')
-rw-r--r-- | src/ranch_server.erl | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/ranch_server.erl b/src/ranch_server.erl index b0ae612..078626f 100644 --- a/src/ranch_server.erl +++ b/src/ranch_server.erl @@ -20,6 +20,8 @@ -export([start_link/0]). -export([insert_listener/2]). -export([lookup_listener/1]). +-export([set_connections_sup/2]). +-export([lookup_connections_sup/1]). -export([add_acceptor/2]). -export([send_to_acceptors/2]). -export([add_connection/1]). @@ -52,7 +54,7 @@ start_link() -> %% @doc Insert a listener into the database. -spec insert_listener(any(), pid()) -> ok. insert_listener(Ref, Pid) -> - true = ets:insert_new(?TAB, {{listener, Ref}, Pid}), + true = ets:insert_new(?TAB, {{listener, Ref}, Pid, undefined}), gen_server:cast(?MODULE, {insert_listener, Ref, Pid}). %% @doc Lookup a listener in the database. @@ -60,6 +62,17 @@ insert_listener(Ref, Pid) -> lookup_listener(Ref) -> ets:lookup_element(?TAB, {listener, Ref}, 2). +%% @doc Set a connection supervisor associated with specific listener. +-spec set_connections_sup(any(), pid()) -> ok. +set_connections_sup(Ref, Pid) -> + true = ets:update_element(?TAB, {listener, Ref}, {3, Pid}), + ok. + +%% @doc Lookup a connection supervisor used by specific listener. +-spec lookup_connections_sup(any()) -> pid() | undefined. +lookup_connections_sup(Ref) -> + ets:lookup_element(?TAB, {listener, Ref}, 3). + %% @doc Add an acceptor for the given listener. -spec add_acceptor(any(), pid()) -> ok. add_acceptor(Ref, Pid) -> |