@@ -1516,17 +1516,24 @@ impl Worker {
15161516 }
15171517 }
15181518
1519- if !imported. is_empty ( ) {
1520- let mut height_changed = false ;
1519+ if let Some ( ( last, rest) ) = imported. split_last ( ) {
1520+ let ( imported, last_proposal_header) = {
1521+ let header =
1522+ c. block_header ( & last. clone ( ) . into ( ) ) . expect ( "ChainNotify is called after the block is imported" ) ;
1523+ let full_header = header. decode ( ) ;
1524+ if self . is_proposal ( full_header. number ( ) , full_header. hash ( ) ) {
1525+ ( rest, Some ( full_header) )
1526+ } else {
1527+ ( imported. as_slice ( ) , None )
1528+ }
1529+ } ;
1530+ let height_at_begin = self . height ;
15211531 for hash in imported {
15221532 // New Commit received, skip to next height.
1523- let header = c . block_header ( & hash . into ( ) ) . expect ( "ChainNotify is called after the block is imported" ) ;
1524-
1533+ let header =
1534+ c . block_header ( & hash . clone ( ) . into ( ) ) . expect ( "ChainNotify is called after the block is imported" ) ;
15251535 let full_header = header. decode ( ) ;
1526- if self . is_proposal ( full_header. number ( ) , full_header. hash ( ) ) {
1527- self . on_imported_proposal ( & full_header) ;
1528- } else if self . height < header. number ( ) {
1529- height_changed = true ;
1536+ if self . height < header. number ( ) {
15301537 cinfo ! ( ENGINE , "Received a commit: {:?}." , header. number( ) ) ;
15311538 let prev_block_view = TendermintSealView :: new ( full_header. seal ( ) )
15321539 . previous_block_view ( )
@@ -1535,9 +1542,11 @@ impl Worker {
15351542 self . save_last_confirmed_view ( prev_block_view) ;
15361543 }
15371544 }
1538- if height_changed {
1545+ if height_at_begin != self . height {
15391546 self . move_to_step ( TendermintState :: Propose , false ) ;
1540- return
1547+ }
1548+ if let Some ( last_proposal_header) = last_proposal_header {
1549+ self . on_imported_proposal ( & last_proposal_header) ;
15411550 }
15421551 }
15431552 }
0 commit comments