Packages
ra
3.1.2
3.1.9
3.1.8
3.1.7
3.1.6
3.1.5
3.1.4
3.1.3
3.1.2
3.1.1
3.1.0
3.0.2
3.0.1
3.0.0
3.0.0-beta.1
2.17.3
2.17.2
2.17.1
2.17.0
2.16.13
2.16.12
2.16.11
2.16.10
2.16.9
2.16.8
2.16.7
2.16.6
2.16.5
2.16.4
2.16.3
2.16.2
2.16.1
2.16.0
2.16.0-pre.12
2.16.0-pre.11
2.16.0-pre.10
2.16.0-pre.9
2.16.0-pre.8
2.16.0-pre.7
2.16.0-pre.6
2.16.0-pre.5
2.16.0-pre.4
2.16.0-pre.3
2.16.0-pre.2
2.16.0-pre.1
2.15.4
2.15.3
2.15.2
2.15.1
2.15.0
2.14.0
2.13.6
2.13.5
2.13.4
2.13.3
2.13.2
2.13.1
2.13.0
2.13.0-pre.1
2.12.0
2.11.0
2.11.0-pre.1
2.10.2-pre.2
2.10.2-pre.1
2.10.1
2.10.0
2.10.0-pre.3
2.10.0-pre.2
2.10.0-pre.1
2.9.10-pre.1
2.9.1
2.9.1-pre.2
2.9.1-pre.1
2.9.0
2.8.0
retired
2.7.3
2.7.2
2.7.1
2.7.0
2.7.0-pre.3
2.7.0-pre.2
2.7.0-pre.1
2.6.3
2.6.2
2.6.1
2.6.0-pre.1
2.5.1
2.5.1-pre.1
2.5.0
2.4.9
2.4.8
2.4.7
2.4.6
2.4.5
2.4.4
2.4.3
2.4.2
retired
2.4.1
2.4.0
2.3.0
2.2.0
2.1.0
2.0.13
2.0.12
2.0.11
2.0.10
2.0.9
2.0.8
2.0.7
2.0.6
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.9.6
0.9.5
0.9.4
0.9.2
0.3.3
retired
0.3.2
retired
0.3.1
retired
Raft library
Current section
Files
Jump to
Current section
Files
src/ra_worker.erl
%% This Source Code Form is subject to the terms of the Mozilla Public
%% License, v. 2.0. If a copy of the MPL was not distributed with this
%% file, You can obtain one at https://mozilla.org/MPL/2.0/.
%%
%% Copyright (c) 2017-2023 Broadcom. All Rights Reserved. The term Broadcom refers to Broadcom Inc. and/or its subsidiaries.
%%
%% @hidden
-module(ra_worker).
-behaviour(gen_server).
-include("ra.hrl").
-export([start_link/1,
queue_work/3]).
-export([init/1,
handle_call/3,
handle_cast/2,
handle_info/2,
terminate/2,
code_change/3]).
-record(state, {log_id = "" :: unicode:chardata()
}).
%%% ra worker responsible for doing background work for a ra server.
%%%
%%% this could include, writing snapshots or checkpoints or log
%%% compaction
%%%===================================================================
%%% API functions
%%%===================================================================
start_link(Config) ->
gen_server:start_link(?MODULE, Config,
[{hibernate_after, 30000}]).
queue_work(Pid, FunOrMfa, ErrFun) when is_pid(Pid) ->
gen_server:cast(Pid, {work, FunOrMfa, ErrFun}).
%%%===================================================================
%%% gen_server callbacks
%%%===================================================================
init(#{id := Id} = Config) when is_map(Config) ->
process_flag(trap_exit, true),
LogId = maps:get(friendly_name, Config,
lists:flatten(io_lib:format("~w", [Id]))),
{ok, #state{log_id = LogId}}.
handle_call(_, _From, State) ->
{reply, ok, State}.
handle_cast({work, FunOrMfa, ErrFun}, State) ->
case FunOrMfa of
{M, F, Args} ->
try erlang:apply(M, F, Args) of
_ ->
ok
catch Type:Err:Stack ->
?WARN("~ts: worker encounted error ~0p of type ~s, Stack:~n~p",
[State#state.log_id, Err, Type, Stack]),
ErrFun({Type, Err}),
ok
end;
_ when is_function(FunOrMfa) ->
try FunOrMfa() of
_ ->
ok
catch Type:Err:Stack ->
?WARN("~ts: worker encounted error ~0p of type ~s, Stack:~n~p",
[State#state.log_id, Err, Type, Stack]),
ErrFun({Type, Err})
end,
ok
end,
erlang:garbage_collect(),
%% TODO: this wont clear up the bg_work funs, fix this some day
{noreply, State}.
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%%%===================================================================
%%% Internal functions
%%%===================================================================