@@ -50,6 +50,7 @@ use crate::consensus::validator_set::{DynamicValidator, ValidatorSet};
5050use crate :: consensus:: { EngineError , Seal } ;
5151use crate :: encoded;
5252use crate :: error:: { BlockError , Error } ;
53+ use crate :: snapshot_notify:: NotifySender as SnapshotNotifySender ;
5354use crate :: transaction:: { SignedTransaction , UnverifiedTransaction } ;
5455use crate :: views:: BlockView ;
5556use crate :: BlockId ;
@@ -59,6 +60,7 @@ type SpawnResult = (
5960 JoinHandle < ( ) > ,
6061 crossbeam:: Sender < TimeGapParams > ,
6162 crossbeam:: Sender < ( crossbeam:: Sender < network:: Event > , Weak < dyn ConsensusClient > ) > ,
63+ crossbeam:: Sender < SnapshotNotifySender > ,
6264 crossbeam:: Sender < Event > ,
6365 crossbeam:: Sender < ( ) > ,
6466) ;
@@ -97,6 +99,7 @@ struct Worker {
9799 time_gap_params : TimeGapParams ,
98100 timeout_token_nonce : usize ,
99101 vote_regression_checker : VoteRegressionChecker ,
102+ snapshot_notify_sender : SnapshotNotifySender ,
100103}
101104
102105pub enum Event {
@@ -180,6 +183,7 @@ impl Worker {
180183 extension : EventSender < network:: Event > ,
181184 client : Weak < dyn ConsensusClient > ,
182185 time_gap_params : TimeGapParams ,
186+ snapshot_notify_sender : SnapshotNotifySender ,
183187 ) -> Self {
184188 Worker {
185189 client,
@@ -198,6 +202,7 @@ impl Worker {
198202 time_gap_params,
199203 timeout_token_nonce : ENGINE_TIMEOUT_TOKEN_NONCE_BASE ,
200204 vote_regression_checker : VoteRegressionChecker :: new ( ) ,
205+ snapshot_notify_sender,
201206 }
202207 }
203208
@@ -206,6 +211,7 @@ impl Worker {
206211 let ( quit, quit_receiver) = crossbeam:: bounded ( 1 ) ;
207212 let ( external_params_initializer, external_params_receiver) = crossbeam:: bounded ( 1 ) ;
208213 let ( extension_initializer, extension_receiver) = crossbeam:: bounded ( 1 ) ;
214+ let ( snapshot_notify_sender_initializer, snapshot_notify_sender_receiver) = crossbeam:: bounded ( 1 ) ;
209215 let join = Builder :: new ( )
210216 . name ( "tendermint" . to_string ( ) )
211217 . spawn ( move || {
@@ -249,8 +255,29 @@ impl Worker {
249255 return
250256 }
251257 } ;
258+ // TODO: Make initialization steps to order insensitive.
259+ let snapshot_notify_sender = crossbeam:: select! {
260+ recv( snapshot_notify_sender_receiver) -> msg => {
261+ match msg {
262+ Ok ( sender) => sender,
263+ Err ( crossbeam:: RecvError ) => {
264+ cerror!( ENGINE , "The tendermint extension is not initalized." ) ;
265+ return
266+ }
267+ }
268+ }
269+ recv( quit_receiver) -> msg => {
270+ match msg {
271+ Ok ( ( ) ) => { } ,
272+ Err ( crossbeam:: RecvError ) => {
273+ cerror!( ENGINE , "The quit channel for tendermint thread had been closed." ) ;
274+ }
275+ }
276+ return
277+ }
278+ } ;
252279 validators. register_client ( Weak :: clone ( & client) ) ;
253- let mut inner = Self :: new ( validators, extension, client, time_gap_params) ;
280+ let mut inner = Self :: new ( validators, extension, client, time_gap_params, snapshot_notify_sender ) ;
254281 loop {
255282 crossbeam:: select! {
256283 recv( receiver) -> msg => {
@@ -374,7 +401,7 @@ impl Worker {
374401 }
375402 } )
376403 . unwrap ( ) ;
377- ( join, external_params_initializer, extension_initializer, sender, quit)
404+ ( join, external_params_initializer, extension_initializer, snapshot_notify_sender_initializer , sender, quit)
378405 }
379406
380407 /// The client is a thread-safe struct. Using it in multi-threads is safe.
0 commit comments