88
99-include (" ra.hrl" ).
1010
11+ -include_lib (" stdlib/include/assert.hrl" ).
1112-type file_err () :: ra_lib :file_err ().
1213
1314% % alias
3334 complete_snapshot /4 ,
3435
3536 begin_accept /2 ,
36- accept_chunk /4 ,
37+ accept_chunk /3 ,
38+ complete_accept /4 ,
3739 abort_accept /1 ,
3840
3941 context /2 ,
7072-record (accept , {% % the next expected chunk
7173 next = 1 :: non_neg_integer (),
7274 state :: term (),
75+ machine_version :: non_neg_integer (),
7376 idxterm :: ra_idxterm ()}).
7477
7578-record (? MODULE ,
@@ -503,26 +506,30 @@ complete_snapshot(IdxTerm, checkpoint, _LiveIndexes,
503506
504507-spec begin_accept (meta (), state ()) ->
505508 {ok , state ()}.
506- begin_accept (#{index := Idx , term := Term } = Meta ,
509+ begin_accept (#{index := Idx ,
510+ machine_version := SnapMacVer ,
511+ term := Term } = Meta ,
507512 #? MODULE {module = Mod ,
508513 snapshot_directory = Dir } = State ) ->
509514 SnapDir = make_snapshot_dir (Dir , Idx , Term ),
510515 ok = ra_lib :make_dir (SnapDir ),
511516 {ok , AcceptState } = Mod :begin_accept (SnapDir , Meta ),
512517 {ok , State #? MODULE {accepting = # accept {idxterm = {Idx , Term },
518+ machine_version = SnapMacVer ,
513519 state = AcceptState }}}.
514520
515- -spec accept_chunk (term (), non_neg_integer (), chunk_flag (), state ()) ->
516- {ok , state (), [effect ()]}.
517- accept_chunk (Chunk , Num , last ,
518- #? MODULE {uid = _UId ,
519- module = Mod ,
520- snapshot_directory = Dir ,
521- current = Current ,
522- pending = Pending ,
523- accepting = # accept {next = Num ,
524- idxterm = {_Idx , _ } = IdxTerm ,
525- state = AccState }} = State ) ->
521+ -spec complete_accept (Chunk :: term (), Num :: non_neg_integer (),
522+ Machine :: ra_machine :machine (), state ()) ->
523+ {state (), MacState :: term (), ra_seq :state (), [effect ()]}.
524+ complete_accept (Chunk , Num , Machine ,
525+ #? MODULE {uid = UId ,
526+ module = Mod ,
527+ snapshot_directory = Dir ,
528+ current = Current ,
529+ pending = Pending ,
530+ accepting = # accept {next = Num ,
531+ idxterm = {Idx , Term } = IdxTerm ,
532+ state = AccState }} = State0 ) ->
526533 % % last chunk
527534 ok = Mod :complete_accept (Chunk , AccState ),
528535 % % run validate here?
@@ -536,25 +543,44 @@ accept_chunk(Chunk, Num, last,
536543 Eff = {bg_work ,
537544 fun () -> [delete (Dir , Del ) || Del <- Dels ] end ,
538545 fun (_ ) -> ok end },
546+ State = State0 #? MODULE {accepting = undefined ,
547+ % % reset any pending snapshot writes
548+ pending = undefined ,
549+ current = IdxTerm },
550+ {ok , #{machine_version := SnapMacVer }, MacState } = recover (State ),
551+ SnapMacMod = ra_machine :which_module (Machine , SnapMacVer ),
552+ LiveIndexes = ra_machine :live_indexes (SnapMacMod , MacState ),
553+ SnapDir = make_snapshot_dir (Dir , Idx , Term ),
554+ ok = write_indexes (SnapDir , LiveIndexes ),
555+ % % delete accepting marker file
556+ AcceptMarker = filename :join (SnapDir , <<" accepting" >>),
557+ _ = prim_file :delete (AcceptMarker ),
558+ % % assert accepting marker is no longer there
559+ ? assertNot (filelib :is_file (AcceptMarker )),
560+ SmallestIdx = case ra_seq :first (LiveIndexes ) of
561+ undefined ->
562+ Idx + 1 ;
563+ I ->
564+ I
565+ end ,
566+ ok = ra_log_snapshot_state :insert (? ETSTBL , UId , Idx , SmallestIdx ,
567+ LiveIndexes ),
568+ {State , MacState , LiveIndexes , [Eff ]}.
539569
540- {ok , State #? MODULE {accepting = undefined ,
541- % % reset any pending snapshot writes
542- pending = undefined ,
543- current = IdxTerm }, [Eff ]};
544- accept_chunk (Chunk , Num , next ,
545- #? MODULE {module = Mod ,
546- accepting =
547- # accept {state = AccState0 ,
548- next = Num } = Accept } = State ) ->
570+ -spec accept_chunk (Chunk :: term (), Num :: non_neg_integer (), state ()) ->
571+ state ().
572+ accept_chunk (Chunk , Num , #? MODULE {module = Mod ,
573+ accepting =
574+ # accept {state = AccState0 ,
575+ next = Num } = Accept } = State ) ->
549576 {ok , AccState } = Mod :accept_chunk (Chunk , AccState0 ),
550- {ok , State #? MODULE {accepting = Accept # accept {state = AccState ,
551- next = Num + 1 }},
552- []};
553- accept_chunk (_Chunk , Num , _ChunkFlag ,
577+ State #? MODULE {accepting = Accept # accept {state = AccState ,
578+ next = Num + 1 }};
579+ accept_chunk (_Chunk , Num ,
554580 #? MODULE {accepting = # accept {next = Next }} = State )
555581 when Next > Num ->
556582 % % this must be a resend - we can just ignore it
557- { ok , State , []} .
583+ State .
558584
559585-spec abort_accept (state ()) -> state ().
560586abort_accept (#? MODULE {accepting = undefined } = State ) ->
0 commit comments