Packages

Resilience library for the BEAM - circuit breaking, rate limiting, bulkheads, and retry

Current section

Files

Jump to
seki src seki_process_sup.erl
Raw

src/seki_process_sup.erl

-module(seki_process_sup).
-moduledoc false.
-behaviour(supervisor).
-export([
start_link/0,
start_child/3,
stop_child/1
]).
-export([init/1]).
start_link() ->
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-spec start_child(module(), atom(), map()) -> {ok, pid()} | {error, term()}.
start_child(Module, Name, Opts) ->
ChildSpec = #{
id => Name,
start => {Module, start_link, [Name, Opts]},
restart => transient,
shutdown => 5000
},
case supervisor:start_child(?MODULE, ChildSpec) of
{ok, Pid} = Ok ->
logger:info(
"Started ~p:~p (pid=~p)",
[Module, Name, Pid],
#{domain => [seki]}
),
Ok;
{error, Reason} = Err ->
logger:error(
"Failed to start ~p:~p: ~p",
[Module, Name, Reason],
#{domain => [seki]}
),
Err
end.
-spec stop_child(atom()) -> ok | {error, term()}.
stop_child(Name) ->
case supervisor:terminate_child(?MODULE, Name) of
ok ->
case supervisor:delete_child(?MODULE, Name) of
ok ->
logger:info(
"Stopped supervised process ~p",
[Name],
#{domain => [seki]}
),
ok;
{error, Reason} = Err ->
logger:error(
"Failed to delete child spec ~p: ~p",
[Name, Reason],
#{domain => [seki]}
),
Err
end;
{error, Reason} = Err ->
logger:error(
"Failed to terminate ~p: ~p",
[Name, Reason],
#{domain => [seki]}
),
Err
end.
init([]) ->
SupFlags = #{
strategy => one_for_one,
intensity => 10,
period => 60
},
{ok, {SupFlags, []}}.