From 19696a7e5b4e35f97f5ae73af09942cad6726831 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Wed, 12 Feb 2020 12:42:50 +0100 Subject: Stop/restart acceptors during the upgrade process --- src/ranch.appup | 8 ++++++-- src/ranch.erl | 27 +++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) (limited to 'src') 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) -> -- cgit v1.2.3