@@ -37,6 +37,7 @@ use crate::account_provider::{AccountProvider, SignError};
3737use crate :: block:: { Block , ClosedBlock , IsBlock } ;
3838use crate :: client:: {
3939 AccountData , BlockChain , BlockProducer , ImportSealedBlock , MiningBlockChainClient , RegularKey , RegularKeyOwner ,
40+ ResealTimer ,
4041} ;
4142use crate :: consensus:: { CodeChainEngine , EngineType } ;
4243use crate :: error:: Error ;
@@ -177,8 +178,12 @@ impl Miner {
177178 self . map_pending_block ( |b| b. header ( ) . clone ( ) , latest_block_number)
178179 }
179180
181+ pub fn get_options ( & self ) -> & MinerOptions {
182+ & self . options
183+ }
184+
180185 /// Check is reseal is allowed and necessary.
181- fn requires_reseal ( & self , best_block : BlockNumber ) -> bool {
186+ fn requires_reseal < C : ResealTimer > ( & self , client : & C , best_block : BlockNumber ) -> bool {
182187 let has_local_parcels = self . mem_pool . read ( ) . has_local_pending_parcels ( ) ;
183188 let mut sealing_work = self . sealing_work . lock ( ) ;
184189 if sealing_work. enabled {
@@ -206,6 +211,7 @@ impl Miner {
206211 } else {
207212 // sealing enabled and we don't want to sleep.
208213 * self . next_allowed_reseal . lock ( ) = Instant :: now ( ) + self . options . reseal_min_period ;
214+ client. set_min_timer ( ) ;
209215 true
210216 }
211217 } else {
@@ -343,53 +349,6 @@ impl Miner {
343349 } )
344350 }
345351
346- /// Returns true if we had to prepare new pending block.
347- fn prepare_work_sealing < C : AccountData + BlockChain + BlockProducer + RegularKeyOwner + ChainTimeInfo > (
348- & self ,
349- client : & C ,
350- ) -> bool {
351- ctrace ! ( MINER , "prepare_work_sealing: entering" ) ;
352- let prepare_new = {
353- let mut sealing_work = self . sealing_work . lock ( ) ;
354- let have_work = sealing_work. queue . peek_last_ref ( ) . is_some ( ) ;
355- ctrace ! ( MINER , "prepare_work_sealing: have_work={}" , have_work) ;
356- if !have_work {
357- sealing_work. enabled = true ;
358- true
359- } else {
360- false
361- }
362- } ;
363- if prepare_new {
364- // --------------------------------------------------------------------------
365- // | NOTE Code below requires transaction_queue and sealing_work locks. |
366- // | Make sure to release the locks before calling that method. |
367- // --------------------------------------------------------------------------
368- match self . prepare_block ( client) {
369- Ok ( ( block, original_work_hash) ) => {
370- self . prepare_work ( block, original_work_hash) ;
371- }
372- Err ( err) => {
373- ctrace ! ( MINER , "prepare_work_sealing: cannot prepare block: {:?}" , err) ;
374- }
375- }
376- }
377- let mut sealing_block_last_request = self . sealing_block_last_request . lock ( ) ;
378- let best_number = client. chain_info ( ) . best_block_number ;
379- if * sealing_block_last_request != best_number {
380- ctrace ! (
381- MINER ,
382- "prepare_work_sealing: Miner received request (was {}, now {}) - waking up." ,
383- * sealing_block_last_request,
384- best_number
385- ) ;
386- * sealing_block_last_request = best_number;
387- }
388-
389- // Return if we restarted
390- prepare_new
391- }
392-
393352 /// Prepares work which has to be done to seal.
394353 fn prepare_work ( & self , block : ClosedBlock , original_work_hash : Option < H256 > ) {
395354 let ( work, is_new) = {
@@ -704,12 +663,59 @@ impl MinerService for Miner {
704663 self . engine . engine_type ( )
705664 }
706665
666+ fn prepare_work_sealing < C : AccountData + BlockChain + BlockProducer + RegularKeyOwner + ChainTimeInfo > (
667+ & self ,
668+ client : & C ,
669+ ) -> bool {
670+ ctrace ! ( MINER , "prepare_work_sealing: entering" ) ;
671+ let prepare_new = {
672+ let mut sealing_work = self . sealing_work . lock ( ) ;
673+ let have_work = sealing_work. queue . peek_last_ref ( ) . is_some ( ) ;
674+ ctrace ! ( MINER , "prepare_work_sealing: have_work={}" , have_work) ;
675+ if !have_work {
676+ sealing_work. enabled = true ;
677+ true
678+ } else {
679+ false
680+ }
681+ } ;
682+ if prepare_new {
683+ // --------------------------------------------------------------------------
684+ // | NOTE Code below requires transaction_queue and sealing_work locks. |
685+ // | Make sure to release the locks before calling that method. |
686+ // --------------------------------------------------------------------------
687+ match self . prepare_block ( client) {
688+ Ok ( ( block, original_work_hash) ) => {
689+ self . prepare_work ( block, original_work_hash) ;
690+ }
691+ Err ( err) => {
692+ ctrace ! ( MINER , "prepare_work_sealing: cannot prepare block: {:?}" , err) ;
693+ }
694+ }
695+ }
696+ let mut sealing_block_last_request = self . sealing_block_last_request . lock ( ) ;
697+ let best_number = client. chain_info ( ) . best_block_number ;
698+ if * sealing_block_last_request != best_number {
699+ ctrace ! (
700+ MINER ,
701+ "prepare_work_sealing: Miner received request (was {}, now {}) - waking up." ,
702+ * sealing_block_last_request,
703+ best_number
704+ ) ;
705+ * sealing_block_last_request = best_number;
706+ }
707+
708+ // Return if we restarted
709+ prepare_new
710+ }
711+
707712 fn update_sealing < C > ( & self , chain : & C )
708713 where
709- C : AccountData + BlockChain + BlockProducer + ImportSealedBlock + RegularKeyOwner + ChainTimeInfo , {
714+ C : AccountData + BlockChain + BlockProducer + ImportSealedBlock + RegularKeyOwner + ResealTimer + ChainTimeInfo ,
715+ {
710716 ctrace ! ( MINER , "update_sealing: preparing a block" ) ;
711717
712- if self . requires_reseal ( chain. chain_info ( ) . best_block_number ) {
718+ if self . requires_reseal ( chain, chain . chain_info ( ) . best_block_number ) {
713719 let ( block, original_work_hash) = match self . prepare_block ( chain) {
714720 Ok ( ( block, original_work_hash) ) => ( block, original_work_hash) ,
715721 Err ( err) => {
@@ -728,7 +734,10 @@ impl MinerService for Miner {
728734 Some ( false ) => ctrace ! ( MINER , "update_sealing: engine is not keen to seal internally right now" ) ,
729735 None => {
730736 ctrace ! ( MINER , "update_sealing: engine does not seal internally, preparing work" ) ;
731- self . prepare_work ( block, original_work_hash)
737+ self . prepare_work ( block, original_work_hash) ;
738+ // Set the reseal max timer, for creating empty blocks every reseal_max_period
739+ // Not related to next_mandatory_reseal, which is used in seal_and_import_block_internally
740+ chain. set_max_timer ( ) ;
732741 }
733742 }
734743 }
0 commit comments