Packages
nova
0.14.3
0.15.1
0.14.3
0.14.1
0.13.7
0.13.1
0.13.0
0.12.1
0.12.0
0.11.0
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.24
0.9.23
0.9.22
0.9.21
0.9.20
0.9.19
0.9.18
0.9.17
0.9.16
0.9.15
0.9.11
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.4.4
0.4.3
0.4.2
0.4.1
0.2.2
0.1.0
0.0.1
0.0.0
Nova is a web application framework
Current section
Files
Jump to
Current section
Files
src/nova_app.erl
%%%-------------------------------------------------------------------
%% @doc
%% Nova application behaviour callback (Not used)
%% @end
%%%-------------------------------------------------------------------
-module(nova_app).
-behaviour(application).
-include_lib("kernel/include/logger.hrl").
%% Application callbacks
-export([start/2, prep_stop/1, stop/1]).
%%====================================================================
%% API
%%====================================================================
start(_StartType, _StartArgs) ->
nova_sup:start_link().
prep_stop(State) ->
graceful_shutdown(),
State.
stop(_State) ->
ok.
%%====================================================================
%% Internal functions
%%====================================================================
graceful_shutdown() ->
Delay = application:get_env(nova, shutdown_delay, 0),
case Delay > 0 of
true ->
?LOG_NOTICE(#{msg => <<"Graceful shutdown started">>, delay_ms => Delay}),
timer:sleep(Delay);
false ->
ok
end,
?LOG_NOTICE(#{msg => <<"Suspending listener">>}),
ranch:suspend_listener(nova_listener),
DrainTimeout = application:get_env(nova, shutdown_drain_timeout, 15000),
?LOG_NOTICE(#{msg => <<"Draining connections">>, timeout_ms => DrainTimeout}),
drain_connections(DrainTimeout),
?LOG_NOTICE(#{msg => <<"Stopping listener">>}),
cowboy:stop_listener(nova_listener),
ok.
drain_connections(Timeout) ->
Deadline = erlang:monotonic_time(millisecond) + Timeout,
drain_loop(Deadline).
drain_loop(Deadline) ->
case ranch:info(nova_listener) of
#{active_connections := 0} ->
ok;
#{active_connections := N} ->
Now = erlang:monotonic_time(millisecond),
case Now >= Deadline of
true ->
?LOG_WARNING(#{msg => <<"Drain timeout reached">>,
remaining_connections => N}),
ok;
false ->
timer:sleep(500),
drain_loop(Deadline)
end
end.