Current section
Files
Jump to
Current section
Files
src/gaffer_queue_pruner.erl
-module(gaffer_queue_pruner).
-moduledoc false.
-behaviour(gen_statem).
% API
-ignore_xref(start_link/1).
-export([start_link/1]).
-ignore_xref(prune/1).
-export([prune/1]).
-ignore_xref(reconfigure/1).
-export([reconfigure/1]).
% gen_statem Callbacks
-export([callback_mode/0]).
-export([init/1]).
-ignore_xref(active/3).
-export([active/3]).
%--- API -----------------------------------------------------------------------
start_link(Name) ->
gen_statem:start_link({local, proc_name(Name)}, ?MODULE, Name, []).
prune(Name) -> call(Name, prune).
reconfigure(Name) -> call(Name, reconfigure).
%--- gen_statem Callbacks ------------------------------------------------------
callback_mode() -> state_functions.
init(Name) ->
#{prune := #{interval := Interval}} = gaffer_queue:conf(Name),
{ok, active, #{name => Name}, [{state_timeout, Interval, prune}]}.
active({call, From}, prune, #{name := Name} = Data) ->
{IDs, Actions} = do_prune(Name),
{keep_state, Data, [{reply, From, IDs} | Actions]};
active(state_timeout, prune, #{name := Name} = Data) ->
{_IDs, Actions} = do_prune(Name),
{keep_state, Data, Actions};
active({call, From}, reconfigure, #{name := Name}) ->
#{prune := #{interval := Interval}} = gaffer_queue:conf(Name),
{keep_state_and_data, [{reply, From, ok}, {state_timeout, Interval, prune}]}.
%--- Internal ------------------------------------------------------------------
call(Name, Msg) -> gen_statem:call(proc_name(Name), Msg).
do_prune(Name) ->
#{prune := #{max_age := MaxAge, interval := Interval}} =
gaffer_queue:conf(Name),
{gaffer_queue:prune_jobs(Name, MaxAge), [{state_timeout, Interval, prune}]}.
proc_name(Name) ->
% elp:ignore W0023 - bounded by queue count, not user input
binary_to_atom(
<<"gaffer_queue_pruner_", (atom_to_binary(Name))/binary>>
).