Packages
ra
0.9.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_log_snapshot_writer.erl
%% @hidden
-module(ra_log_snapshot_writer).
-behaviour(gen_server).
-include("ra.hrl").
%% API functions
-export([start_link/0,
write_snapshot/3,
write_snapshot_call/2
]).
%% gen_server callbacks
-export([init/1,
handle_call/3,
handle_cast/2,
handle_info/2,
terminate/2,
code_change/3]).
-record(state, {}).
%%%===================================================================
%%% API functions
%%%===================================================================
-spec write_snapshot(pid(), file:filename_all(), ra_log:snapshot()) -> ok.
write_snapshot(From, Dir, Snapshot) ->
gen_server:cast(?MODULE, {write_snapshot, From, Dir, Snapshot}).
-spec write_snapshot_call(file:filename(), ra_log:snapshot()) ->
{ok, File :: file:filename(), Old :: [file:filename()]}.
write_snapshot_call(Dir, Snapshot) ->
gen_server:call(?MODULE, {write_snapshot, Dir, Snapshot}).
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
%%%===================================================================
%%% gen_server callbacks
%%%===================================================================
init([]) ->
{ok, #state{}}.
handle_call({write_snapshot, Dir, Snapshot}, _From, State) ->
Reply = write_snapshot(Dir, Snapshot),
{reply, Reply, State}.
handle_cast({write_snapshot, From, Dir, Snapshot}, State) ->
ok = handle_write_snapshot(From, Dir, Snapshot),
{noreply, State}.
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%%%===================================================================
%%% Internal functions
%%%===================================================================
handle_write_snapshot(From, Dir, {Index, Term, _, _} = Snapshot) ->
{ok, File, Old} = write_snapshot(Dir, Snapshot),
From ! {ra_log_event, {snapshot_written, {Index, Term}, File, Old}},
ok.
write_snapshot(Dir, Snapshot) ->
case lists:sort(filelib:wildcard(filename:join(Dir, "*.snapshot"))) of
[] ->
% no snapshots - initialise snapshot counter
File = filename:join(Dir, ra_lib:zpad_filename("", "snapshot", 1)),
ok = write(File, Snapshot),
{ok, File, []};
[LastFile | _] = Old ->
File = ra_lib:zpad_filename_incr(LastFile),
ok = write(File, Snapshot),
{ok, File, Old}
end.
write(File, Snapshot) ->
% TODO: snapshots should be checksummed
?INFO("snapshot_writer: Writing file ~p", [File]),
ra_log_snapshot:write(File, Snapshot).