@@ -102,6 +102,7 @@ pub struct HoneyBadgerBFT {
102102 current_minimum_gas_price : Mutex < Option < U256 > > ,
103103 early_epoch_manager : Mutex < Option < HbbftEarlyEpochEndManager > > ,
104104 hbbft_engine_cache : Mutex < HbbftEngineCache > ,
105+ delayed_hbbft_join : AtomicBool ,
105106}
106107
107108struct TransitionHandler {
@@ -292,6 +293,17 @@ impl TransitionHandler {
292293 // Periodically allow messages received for future epochs to be processed.
293294 self . engine . replay_cached_messages ( ) ;
294295
296+ // rejoin Hbbft Epoch after sync was completed.
297+ if self
298+ . engine
299+ . delayed_hbbft_join
300+ . load ( std:: sync:: atomic:: Ordering :: SeqCst )
301+ {
302+ if let Err ( e) = self . engine . join_hbbft_epoch ( ) {
303+ error ! ( target: "engine" , "Error trying to join epoch after synced: {}" , e) ;
304+ }
305+ }
306+
295307 self . handle_shutdown_on_missing_block_import ( shutdown_on_missing_block_import_config) ;
296308
297309 let mut timer_duration = self . min_block_time_remaining ( client. clone ( ) ) ;
@@ -469,14 +481,15 @@ impl HoneyBadgerBFT {
469481 ) ,
470482 sealing : RwLock :: new ( BTreeMap :: new ( ) ) ,
471483 params,
472- message_counter : Mutex :: new ( 0 ) ,
484+ message_counter : Mutex :: new ( 0 ) , // restore message counter from memory here for RBC ? */
473485 random_numbers : RwLock :: new ( BTreeMap :: new ( ) ) ,
474486 keygen_transaction_sender : RwLock :: new ( KeygenTransactionSender :: new ( ) ) ,
475487
476488 has_connected_to_validator_set : AtomicBool :: new ( false ) ,
477489 current_minimum_gas_price : Mutex :: new ( None ) ,
478490 early_epoch_manager : Mutex :: new ( None ) ,
479491 hbbft_engine_cache : Mutex :: new ( HbbftEngineCache :: new ( ) ) ,
492+ delayed_hbbft_join : AtomicBool :: new ( false ) ,
480493 } ) ;
481494
482495 if !engine. params . is_unit_test . unwrap_or ( false ) {
@@ -496,6 +509,8 @@ impl HoneyBadgerBFT {
496509 . hbbft_peers_service
497510 . register_handler ( Arc :: new ( peers_handler) ) ?;
498511
512+ // todo:
513+ // setup rev
499514 Ok ( engine)
500515 }
501516
@@ -810,9 +825,18 @@ impl HoneyBadgerBFT {
810825 let client = self . client_arc ( ) . ok_or ( EngineError :: RequiresClient ) ?;
811826 if self . is_syncing ( & client) {
812827 trace ! ( target: "consensus" , "tried to join HBBFT Epoch, but still syncing." ) ;
828+ self . delayed_hbbft_join
829+ . store ( true , std:: sync:: atomic:: Ordering :: SeqCst ) ;
813830 return Ok ( ( ) ) ;
814831 }
815832
833+ if self
834+ . delayed_hbbft_join
835+ . swap ( false , std:: sync:: atomic:: Ordering :: SeqCst )
836+ {
837+ trace ! ( target: "consensus" , "continued join_hbbft_epoch after sync was completed." ) ;
838+ }
839+
816840 let step = self
817841 . hbbft_state
818842 . write ( )
@@ -1295,6 +1319,9 @@ impl Engine<EthereumMachine> for HoneyBadgerBFT {
12951319 error ! ( target: "engine" , "hbbft-hardfork : could not initialialize hardfork manager, no latest block found." ) ;
12961320 }
12971321
1322+ // RBC: we need to replay disk cached messages here.
1323+ // state.replay_cached_messages(client)
1324+
12981325 match state. update_honeybadger (
12991326 client,
13001327 & self . signer ,
@@ -1664,6 +1691,7 @@ mod tests {
16641691
16651692 let mut builder: HoneyBadgerBuilder < Contribution , _ > =
16661693 HoneyBadger :: builder ( Arc :: new ( net_info. clone ( ) ) ) ;
1694+ builder. max_future_epochs ( 0 ) ;
16671695
16681696 let mut honey_badger = builder. build ( ) ;
16691697
0 commit comments