diff options
author | Loïc Hoguin <[email protected]> | 2020-02-12 12:42:50 +0100 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2020-02-21 11:19:37 +0100 |
commit | 19696a7e5b4e35f97f5ae73af09942cad6726831 (patch) | |
tree | 2e33ec147bd0a094fb08dc42487acf7f9ebde945 /src | |
parent | 4b80e31bc48a7fd8552ee34f59de26c790b19ceb (diff) | |
download | ranch-19696a7e5b4e35f97f5ae73af09942cad6726831.tar.gz ranch-19696a7e5b4e35f97f5ae73af09942cad6726831.tar.bz2 ranch-19696a7e5b4e35f97f5ae73af09942cad6726831.zip |
Stop/restart acceptors during the upgrade process
Diffstat (limited to 'src')
-rw-r--r-- | src/ranch.appup | 8 | ||||
-rw-r--r-- | src/ranch.erl | 27 |
2 files changed, 33 insertions, 2 deletions
diff --git a/src/ranch.appup b/src/ranch.appup index 0041e01..dcb47f0 100644 --- a/src/ranch.appup +++ b/src/ranch.appup @@ -3,6 +3,7 @@ {"2.0.0-rc.2", [{<<"2\\.0\\.[0-9]+.*">>, [ + {apply, {ranch, stop_all_acceptors, []}}, {load_module, ranch}, {load_module, ranch_acceptor}, {update, ranch_acceptors_sup, supervisor}, @@ -19,9 +20,11 @@ {load_module, ranch_ssl}, {update, ranch_sup, supervisor}, {load_module, ranch_tcp}, - {load_module, ranch_transport} + {load_module, ranch_transport}, + {apply, {ranch, restart_all_acceptors, []}} ]}], [{<<"2\\.0\\.[0-9]+.*">>, [ + {apply, {ranch, stop_all_acceptors, []}}, {load_module, ranch}, {load_module, ranch_acceptor}, {update, ranch_acceptors_sup, supervisor}, @@ -38,6 +41,7 @@ {load_module, ranch_ssl}, {update, ranch_sup, supervisor}, {load_module, ranch_tcp}, - {load_module, ranch_transport} + {load_module, ranch_transport}, + {apply, {ranch, restart_all_acceptors, []}} ]}] }. diff --git a/src/ranch.erl b/src/ranch.erl index 89ca21e..a400798 100644 --- a/src/ranch.erl +++ b/src/ranch.erl @@ -19,6 +19,8 @@ -export([stop_listener/1]). -export([suspend_listener/1]). -export([resume_listener/1]). +-export([stop_all_acceptors/0]). +-export([restart_all_acceptors/0]). -export([child_spec/5]). -export([handshake/1]). -export([handshake/2]). @@ -192,6 +194,31 @@ maybe_resumed({ok, _, _}) -> maybe_resumed(Res) -> Res. +-spec stop_all_acceptors() -> ok. +stop_all_acceptors() -> + _ = [ok = do_acceptors(Pid, terminate_child) + || {_, Pid} <- ranch_server:get_listener_sups()], + ok. + +-spec restart_all_acceptors() -> ok. +restart_all_acceptors() -> + _ = [ok = do_acceptors(Pid, restart_child) + || {_, Pid} <- ranch_server:get_listener_sups()], + ok. + +do_acceptors(ListenerSup, F) -> + ListenerChildren = supervisor:which_children(ListenerSup), + case lists:keyfind(ranch_acceptors_sup, 1, ListenerChildren) of + {_, AcceptorsSup, _, _} when is_pid(AcceptorsSup) -> + AcceptorChildren = supervisor:which_children(AcceptorsSup), + %% @todo What about errors? + _ = [supervisor:F(AcceptorsSup, AcceptorId) + || {AcceptorId, _, _, _} <- AcceptorChildren], + ok; + {_, Atom, _, _} -> + {error, Atom} + end. + -spec child_spec(ref(), module(), opts(), module(), any()) -> supervisor:child_spec(). child_spec(Ref, Transport, TransOpts0, Protocol, ProtoOpts) -> |