2121 append_sync /2 ,
2222 write_sync /2 ,
2323 fold /5 ,
24+ fold /6 ,
2425 sparse_read /2 ,
2526 partial_read /3 ,
2627 execute_read_plan /4 ,
@@ -491,7 +492,7 @@ write([{Idx, _, _} | _], #?MODULE{cfg = #cfg{uid = UId},
491492 [UId , Idx , Range ])),
492493 {error , {integrity_error , Msg }}.
493494
494- -spec write_sparse (log_entry (), ra :index (), state ()) ->
495+ -spec write_sparse (log_entry (), option ( ra :index () ), state ()) ->
495496 {ok , state ()} | {error , wal_down | gap_detected }.
496497write_sparse ({Idx , Term , _ } = Entry , PrevIdx0 ,
497498 #? MODULE {cfg = # cfg {uid = UId ,
@@ -533,11 +534,18 @@ write_sparse({Idx, Term, _} = Entry, PrevIdx0,
533534-spec fold (FromIdx :: ra_index (), ToIdx :: ra_index (),
534535 fun ((log_entry (), Acc ) -> Acc ), Acc , state ()) ->
535536 {Acc , state ()} when Acc :: term ().
537+ fold (From0 , To0 , Fun , Acc0 , State ) ->
538+ fold (From0 , To0 , Fun , Acc0 , State , error ).
539+
540+ -spec fold (FromIdx :: ra_index (), ToIdx :: ra_index (),
541+ fun ((log_entry (), Acc ) -> Acc ), Acc , state (),
542+ MissingKeyStrategy :: error | return ) ->
543+ {Acc , state ()} when Acc :: term ().
536544fold (From0 , To0 , Fun , Acc0 ,
537545 #? MODULE {cfg = Cfg ,
538546 mem_table = Mt ,
539547 range = {StartIdx , EndIdx },
540- reader = Reader0 } = State )
548+ reader = Reader0 } = State , MissingKeyStrat )
541549 when To0 >= From0 andalso
542550 To0 >= StartIdx ->
543551
@@ -550,22 +558,27 @@ fold(From0, To0, Fun, Acc0,
550558 case MtOverlap of
551559 {undefined , {RemStart , RemEnd }} ->
552560 {Reader , Acc } = ra_log_segments :fold (RemStart , RemEnd , Fun ,
553- Acc0 , Reader0 ),
561+ Acc0 , Reader0 ,
562+ MissingKeyStrat ),
554563 {Acc , State #? MODULE {reader = Reader }};
555564 {{MtStart , MtEnd }, {RemStart , RemEnd }} ->
556565 {Reader , Acc1 } = ra_log_segments :fold (RemStart , RemEnd , Fun ,
557- Acc0 , Reader0 ),
558- Acc = ra_mt :fold (MtStart , MtEnd , Fun , Acc1 , Mt ),
566+ Acc0 , Reader0 ,
567+ MissingKeyStrat ),
568+ Acc = ra_mt :fold (MtStart , MtEnd , Fun , Acc1 , Mt , MissingKeyStrat ),
559569 NumRead = MtEnd - MtStart + 1 ,
560570 ok = incr_counter (Cfg , ? C_RA_LOG_READ_MEM_TBL , NumRead ),
561571 {Acc , State #? MODULE {reader = Reader }};
562572 {{MtStart , MtEnd }, undefined } ->
563- Acc = ra_mt :fold (MtStart , MtEnd , Fun , Acc0 , Mt ),
573+ Acc = ra_mt :fold (MtStart , MtEnd , Fun , Acc0 , Mt , MissingKeyStrat ),
574+ % % TODO: if fold is short circuited with MissingKeyStrat == return
575+ % % this count isn't correct, it doesn't massively matter so leaving
576+ % % for now
564577 NumRead = MtEnd - MtStart + 1 ,
565578 ok = incr_counter (Cfg , ? C_RA_LOG_READ_MEM_TBL , NumRead ),
566579 {Acc , State }
567580 end ;
568- fold (_From , _To , _Fun , Acc , State ) ->
581+ fold (_From , _To , _Fun , Acc , State , _ ) ->
569582 {Acc , State }.
570583
571584% % @doc Reads a list of indexes.
0 commit comments