5858-record (batch_writer , {smallest_live_idx :: ra_index (),
5959 tid :: ets :tid (),
6060 uid :: term (),
61- range :: ra : range (),
61+ seq :: ra_seq : state (),
6262 term :: ra_term (),
6363 old :: undefined | # batch_writer {}
6464 }).
@@ -491,39 +491,39 @@ write_data({UId, Pid} = Id, MtTid, Idx, Term, Data0, Trunc, SmallestIndex,
491491 end .
492492
493493
494- handle_msg ({append , {UId , Pid } = Id , MtTid , PrevIdx0 , Idx , Term , Entry },
494+ handle_msg ({append , {UId , Pid } = Id , MtTid , ExpectedPrevIdx , Idx , Term , Entry },
495495 # state {conf = Conf ,
496496 writers = Writers } = State0 ) ->
497497 SmallestIdx = smallest_live_index (Conf , UId ),
498498 % % detect if truncating flag should be set
499499 Trunc = Idx == SmallestIdx ,
500500
501- case maps :find (UId , Writers ) of
501+ case maps :get (UId , Writers , undefined ) of
502502 _ when Idx < SmallestIdx ->
503503 % % the smallest live index for the last snapshot is higher than
504504 % % this index, just drop it
505505 LastIdx = SmallestIdx - 1 ,
506506 State0 # state {writers = Writers #{UId => {in_seq , LastIdx }}};
507- {ok , { _ , PrevIdx } }
508- when PrevIdx0 =< PrevIdx orelse
507+ {_ , PrevIdx }
508+ when ExpectedPrevIdx =< PrevIdx orelse
509509 Trunc ->
510510 % % if the passed in previous index is less than the last written
511511 % % index (gap detection) _or_ it is a truncation
512512 % % then we can proceed and write the entry
513513 write_data (Id , MtTid , Idx , Term , Entry , Trunc , SmallestIdx , State0 );
514- error ->
514+ undefined ->
515515 % % no state for the UId is known so go ahead and write
516516 write_data (Id , MtTid , Idx , Term , Entry , false , SmallestIdx , State0 );
517- {ok , { out_of_seq , _ } } ->
517+ {out_of_seq , _ } ->
518518 % writer is out of seq simply ignore drop the write
519519 % TODO: capture metric for dropped writes?
520520 State0 ;
521- {ok , { in_seq , PrevIdx } } ->
521+ {in_seq , PrevIdx } ->
522522 % writer was in seq but has sent an out of seq entry
523523 % notify writer
524524 ? DEBUG (" WAL in ~ts : requesting resend from `~w `, "
525- " last idx ~b idx received ~b " ,
526- [Conf # conf .system , UId , PrevIdx , Idx ]),
525+ " last idx ~b idx received ( ~b , ~b ) " ,
526+ [Conf # conf .system , UId , PrevIdx , ExpectedPrevIdx , Idx ]),
527527 Pid ! {ra_log_event , {resend_write , PrevIdx + 1 }},
528528 State0 # state {writers = Writers #{UId => {out_of_seq , PrevIdx }}}
529529 end ;
@@ -538,32 +538,28 @@ incr_batch(#batch{num_writes = Writes,
538538 waiting = Waiting0 ,
539539 pending = Pend } = Batch ,
540540 UId , Pid , MT_TID = MtTid ,
541- Idx , TERM = Term , Data , SmallestIdx ) ->
541+ Idx , TERM = Term , Data , SmallestLiveIdx ) ->
542542 Waiting = case Waiting0 of
543543 #{Pid := # batch_writer {term = TERM ,
544544 tid = MT_TID ,
545- range = Range0
546- } = W } ->
545+ seq = Seq0 } = W } ->
547546 % % The Tid and term is the same so add to current batch_writer
548- Range = ra_range :extend (Idx , ra_range :truncate (SmallestIdx - 1 ,
549- Range0 )),
547+ Range = ra_seq :append (Idx , Seq0 ),
550548 % % TODO: range nees to become a ra_seq so that we can
551549 % % capture sparse writes correctly
552- Waiting0 #{Pid => W # batch_writer {range = Range ,
553- smallest_live_idx = SmallestIdx ,
554- term = Term
555- }};
550+ Waiting0 #{Pid => W # batch_writer {seq = Range ,
551+ smallest_live_idx = SmallestLiveIdx ,
552+ term = Term }};
556553 _ ->
557554 % % The tid is different, open a new batch writer for the
558555 % % new tid and term
559556 PrevBatchWriter = maps :get (Pid , Waiting0 , undefined ),
560- Writer = # batch_writer {smallest_live_idx = SmallestIdx ,
557+ Writer = # batch_writer {smallest_live_idx = SmallestLiveIdx ,
561558 tid = MtTid ,
562- range = ra_range : new ( Idx ) ,
559+ seq = [ Idx ] ,
563560 uid = UId ,
564561 term = Term ,
565- old = PrevBatchWriter
566- },
562+ old = PrevBatchWriter },
567563 Waiting0 #{Pid => Writer }
568564 end ,
569565
@@ -699,7 +695,7 @@ complete_batch(#state{batch = #batch{waiting = Waiting,
699695complete_batch_writer (Pid , # batch_writer {smallest_live_idx = SmallestIdx ,
700696 tid = MtTid ,
701697 uid = UId ,
702- range = Range ,
698+ seq = Range ,
703699 term = Term ,
704700 old = undefined }, Ranges ) ->
705701 Pid ! {ra_log_event , {written , Term , Range }},
@@ -972,23 +968,24 @@ should_roll_wal(#state{conf = #conf{max_entries = MaxEntries},
972968smallest_live_index (# conf {ra_log_snapshot_state_tid = Tid }, ServerUId ) ->
973969 ra_log_snapshot_state :smallest (Tid , ServerUId ).
974970
975- update_ranges (Ranges , UId , MtTid , SmallestIdx , { Start , _ } = AddRange ) ->
971+ update_ranges (Ranges , UId , MtTid , SmallestIdx , AddSeq ) ->
976972 case Ranges of
977- #{UId := [{MtTid , Range0 } | Rem ]} ->
973+ #{UId := [{MtTid , Seq0 } | Rem ]} ->
978974 % % SmallestIdx might have moved to we truncate the old range first
979975 % % before extending
980- Range1 = ra_range : truncate (SmallestIdx - 1 , Range0 ),
976+ Seq1 = ra_seq : floor (SmallestIdx , Seq0 ),
981977 % % limit the old range by the add end start as in some resend
982978 % % cases we may have got back before the prior range.
983- Range = ra_range :add (AddRange , ra_range : limit ( Start , Range1 ) ),
984- Ranges #{UId => [{MtTid , Range } | Rem ]};
985- #{UId := [{OldMtTid , OldMtRange } | Rem ]} ->
979+ Seq = ra_seq :add (AddSeq , Seq1 ),
980+ Ranges #{UId => [{MtTid , Seq } | Rem ]};
981+ #{UId := [{OldMtTid , OldMtSeq } | Rem ]} ->
986982 % % new Tid, need to add a new range record for this
987- Ranges #{UId => [{MtTid , AddRange },
988- ra_range :truncate (SmallestIdx - 1 , {OldMtTid , OldMtRange })
983+ Ranges #{UId => [{MtTid , AddSeq },
984+ {OldMtTid ,
985+ ra_seq :floor (SmallestIdx , OldMtSeq )}
989986 | Rem ]};
990987 _ ->
991- Ranges #{UId => [{MtTid , AddRange }]}
988+ Ranges #{UId => [{MtTid , AddSeq }]}
992989 end .
993990
994991recover_entry (Names , UId , {Idx , _ , _ } = Entry , SmallestIdx ,
@@ -1005,7 +1002,7 @@ recover_entry(Names, UId, {Idx, _, _} = Entry, SmallestIdx,
10051002 case ra_mt :insert (Entry , Mt0 ) of
10061003 {ok , Mt1 } ->
10071004 Ranges = update_ranges (Ranges0 , UId , ra_mt :tid (Mt1 ),
1008- SmallestIdx , ra_range : new ( Idx ) ),
1005+ SmallestIdx , [ Idx ] ),
10091006 {ok , State # recovery {ranges = Ranges ,
10101007 writers = Writers #{UId => {in_seq , Idx }},
10111008 tables = Tables #{UId => Mt1 }}};
@@ -1037,7 +1034,7 @@ recover_entry(Names, UId, {Idx, Term, _}, SmallestIdx,
10371034 tables = Tables #{UId => Mt0 }}};
10381035 Tid ->
10391036 Ranges = update_ranges (Ranges0 , UId , Tid ,
1040- SmallestIdx , ra_range : new ( Idx ) ),
1037+ SmallestIdx , [ Idx ] ),
10411038 {ok , State # recovery {ranges = Ranges ,
10421039 writers = Writers #{UId => {in_seq , Idx }},
10431040 tables = Tables #{UId => Mt0 }}}
0 commit comments