@@ -59,10 +59,11 @@ pub fn duty_tracker_task<D: Database>(
5959
6060 let idx = database. client_state_provider ( ) . get_last_checkpoint_idx ( ) ?;
6161 let last_checkpoint_state = database. client_state_provider ( ) . get_state_checkpoint ( idx) ?;
62- let mut last_finalized_blk = match last_checkpoint_state {
62+ let last_finalized_blk = match last_checkpoint_state {
6363 Some ( state) => state. sync ( ) . map ( |sync| * sync. finalized_blkid ( ) ) ,
6464 None => None ,
6565 } ;
66+ duties_tracker. set_finalized_block ( last_finalized_blk) ;
6667
6768 loop {
6869 let update = match cupdate_rx. blocking_recv ( ) {
@@ -82,13 +83,7 @@ pub fn duty_tracker_task<D: Database>(
8283 trace ! ( %ev_idx, "new consensus state, updating duties" ) ;
8384 trace ! ( "STATE: {new_state:#?}" ) ;
8485
85- if let Err ( e) = update_tracker (
86- & mut duties_tracker,
87- new_state,
88- & ident,
89- database. as_ref ( ) ,
90- & mut last_finalized_blk,
91- ) {
86+ if let Err ( e) = update_tracker ( & mut duties_tracker, new_state, & ident, database. as_ref ( ) ) {
9287 error ! ( err = %e, "failed to update duties tracker" ) ;
9388 }
9489
@@ -109,7 +104,6 @@ fn update_tracker<D: Database>(
109104 state : & ClientState ,
110105 ident : & Identity ,
111106 database : & D ,
112- last_finalized_block : & mut Option < L2BlockId > ,
113107) -> Result < ( ) , Error > {
114108 let Some ( ss) = state. sync ( ) else {
115109 return Ok ( ( ) ) ;
@@ -129,8 +123,11 @@ fn update_tracker<D: Database>(
129123
130124 // Figure out which blocks were finalized
131125 let new_finalized = state. sync ( ) . map ( |sync| * sync. finalized_blkid ( ) ) ;
132- let newly_finalized_blocks: Vec < L2BlockId > =
133- get_finalized_blocks ( new_finalized, l2prov. as_ref ( ) , last_finalized_block) ?;
126+ let newly_finalized_blocks: Vec < L2BlockId > = get_finalized_blocks (
127+ tracker. get_finalized_block ( ) ,
128+ l2prov. as_ref ( ) ,
129+ new_finalized,
130+ ) ?;
134131
135132 let tracker_update = duties:: StateUpdate :: new ( block_idx, ts, newly_finalized_blocks) ;
136133 let n_evicted = tracker. update ( & tracker_update) ;
@@ -143,36 +140,30 @@ fn update_tracker<D: Database>(
143140}
144141
145142fn get_finalized_blocks (
146- finalized : Option < L2BlockId > ,
143+ last_finalized_block : Option < L2BlockId > ,
147144 l2prov : & impl L2DataProvider ,
148- last_finalized_block : & mut Option < L2BlockId > ,
145+ finalized : Option < L2BlockId > ,
149146) -> Result < Vec < L2BlockId > , Error > {
150147 // Figure out which blocks were finalized
151148 let mut newly_finalized_blocks: Vec < L2BlockId > = Vec :: new ( ) ;
152149 let mut new_finalized = finalized;
153150
154- loop {
155- if let Some ( finalized) = new_finalized {
156- // If the last finalized block is equal to the new finalized block,
157- // it means that no new blocks are finalized
158- if * last_finalized_block == Some ( finalized) {
159- break ;
160- }
161-
162- // else loop till we reach to the last finalized block or go all the way
163- // as long as we get some block data
164- // TODO: verify if this works as expected
165- newly_finalized_blocks. push ( finalized) ;
151+ while let Some ( finalized) = new_finalized {
152+ // If the last finalized block is equal to the new finalized block,
153+ // it means that no new blocks are finalized
154+ if last_finalized_block == Some ( finalized) {
155+ break ;
156+ }
166157
167- match l2prov. get_block_data ( finalized) ? {
168- Some ( block) => new_finalized = Some ( * block. header ( ) . parent ( ) ) ,
169- None => break ,
170- }
158+ // else loop till we reach to the last finalized block or go all the way
159+ // as long as we get some block data
160+ match l2prov. get_block_data ( finalized) ? {
161+ Some ( block) => new_finalized = Some ( * block. header ( ) . parent ( ) ) ,
162+ None => break ,
171163 }
172- }
173164
174- // Update the last_finalized_block with the new_finalized value
175- * last_finalized_block = finalized ;
165+ newly_finalized_blocks . push ( finalized ) ;
166+ }
176167
177168 Ok ( newly_finalized_blocks)
178169}
@@ -455,18 +446,50 @@ mod tests {
455446
456447 let block_ids: Vec < _ > = chain. iter ( ) . map ( |b| b. header ( ) . get_blockid ( ) ) . collect ( ) ;
457448
458- let mut last_finalized_block = Some ( block_ids[ 0 ] ) ;
459- let new_finalized = Some ( block_ids[ 4 ] ) ;
460- let finalized_blocks = get_finalized_blocks (
461- new_finalized,
462- db. l2_provider ( ) . as_ref ( ) ,
463- & mut last_finalized_block,
464- )
465- . unwrap ( ) ;
449+ {
450+ let last_finalized_block = Some ( block_ids[ 0 ] ) ;
451+ let new_finalized = Some ( block_ids[ 4 ] ) ;
452+ let finalized_blocks = get_finalized_blocks (
453+ last_finalized_block,
454+ db. l2_provider ( ) . as_ref ( ) ,
455+ new_finalized,
456+ )
457+ . unwrap ( ) ;
458+
459+ let expected_finalized_blocks: Vec < _ > =
460+ block_ids[ 1 ..=4 ] . iter ( ) . rev ( ) . cloned ( ) . collect ( ) ;
461+
462+ assert_eq ! ( finalized_blocks, expected_finalized_blocks) ;
463+ }
466464
467- let expected_finalized_blocks: Vec < _ > = block_ids[ 1 ..=4 ] . iter ( ) . rev ( ) . cloned ( ) . collect ( ) ;
465+ {
466+ let last_finalized_block = None ;
467+ let new_finalized = Some ( block_ids[ 4 ] ) ;
468+ let finalized_blocks = get_finalized_blocks (
469+ last_finalized_block,
470+ db. l2_provider ( ) . as_ref ( ) ,
471+ new_finalized,
472+ )
473+ . unwrap ( ) ;
468474
469- assert_eq ! ( finalized_blocks, expected_finalized_blocks) ;
470- assert_eq ! ( last_finalized_block, new_finalized) ;
475+ let expected_finalized_blocks: Vec < _ > =
476+ block_ids[ 0 ..=4 ] . iter ( ) . rev ( ) . cloned ( ) . collect ( ) ;
477+
478+ assert_eq ! ( finalized_blocks, expected_finalized_blocks) ;
479+ }
480+
481+ {
482+ let last_finalized_block = None ;
483+ let new_finalized = None ;
484+ let finalized_blocks = get_finalized_blocks (
485+ last_finalized_block,
486+ db. l2_provider ( ) . as_ref ( ) ,
487+ new_finalized,
488+ )
489+ . unwrap ( ) ;
490+
491+ let expected_finalized_blocks: Vec < _ > = vec ! [ ] ;
492+ assert_eq ! ( finalized_blocks, expected_finalized_blocks) ;
493+ }
471494 }
472495}
0 commit comments