@@ -4,19 +4,20 @@ use std::collections::HashMap;
44use std:: sync:: { Arc , RwLock } ;
55use std:: time;
66
7- use alpen_express_btcio:: writer:: DaWriter ;
8- use alpen_express_primitives:: buf:: { Buf32 , Buf64 } ;
9- use alpen_express_state:: batch:: { BatchCommitment , SignedBatchCommitment } ;
10- use alpen_express_state:: da_blob:: { BlobDest , BlobIntent } ;
11- use express_storage:: L2BlockManager ;
127use tokio:: sync:: broadcast;
138use tracing:: * ;
149
10+ use alpen_express_btcio:: writer:: DaWriter ;
1511use alpen_express_db:: traits:: * ;
1612use alpen_express_eectl:: engine:: ExecEngineCtl ;
13+ use alpen_express_primitives:: buf:: { Buf32 , Buf64 } ;
1714use alpen_express_primitives:: params:: Params ;
15+ use alpen_express_state:: batch:: { BatchCommitment , SignedBatchCommitment } ;
1816use alpen_express_state:: client_state:: ClientState ;
17+ use alpen_express_state:: da_blob:: { BlobDest , BlobIntent } ;
1918use alpen_express_state:: prelude:: * ;
19+ use express_storage:: L2BlockManager ;
20+ use express_tasks:: { ShutdownGuard , TaskExecutor } ;
2021
2122use super :: types:: { self , Duty , DutyBatch , Identity , IdentityKey } ;
2223use super :: { block_assembly, extractor} ;
@@ -26,6 +27,7 @@ use crate::message::{ClientUpdateNotif, ForkChoiceMessage};
2627use crate :: sync_manager:: SyncManager ;
2728
2829pub fn duty_tracker_task < D : Database > (
30+ shutdown : ShutdownGuard ,
2931 cupdate_rx : broadcast:: Receiver < Arc < ClientUpdateNotif > > ,
3032 batch_queue : broadcast:: Sender < DutyBatch > ,
3133 ident : Identity ,
@@ -35,6 +37,7 @@ pub fn duty_tracker_task<D: Database>(
3537) {
3638 let db = database. as_ref ( ) ;
3739 if let Err ( e) = duty_tracker_task_inner (
40+ shutdown,
3841 cupdate_rx,
3942 batch_queue,
4043 ident,
@@ -47,6 +50,7 @@ pub fn duty_tracker_task<D: Database>(
4750}
4851
4952fn duty_tracker_task_inner (
53+ shutdown : ShutdownGuard ,
5054 mut cupdate_rx : broadcast:: Receiver < Arc < ClientUpdateNotif > > ,
5155 batch_queue : broadcast:: Sender < DutyBatch > ,
5256 ident : Identity ,
@@ -65,6 +69,10 @@ fn duty_tracker_task_inner(
6569 duties_tracker. set_finalized_block ( last_finalized_blk) ;
6670
6771 loop {
72+ if shutdown. should_shutdown ( ) {
73+ warn ! ( "received shutdown signal" ) ;
74+ break ;
75+ }
6876 let update = match cupdate_rx. blocking_recv ( ) {
6977 Ok ( u) => u,
7078 Err ( broadcast:: error:: RecvError :: Closed ) => {
@@ -182,12 +190,14 @@ struct DutyExecStatus {
182190 result : Result < ( ) , Error > ,
183191}
184192
185- #[ allow( clippy:: too_many_arguments) ]
193+ #[ allow( clippy:: too_many_arguments) ] // FIXME
186194pub fn duty_dispatch_task <
187195 D : Database + Sync + Send + ' static ,
188196 E : ExecEngineCtl + Sync + Send + ' static ,
189197 S : SequencerDatabase + Sync + Send + ' static ,
190198> (
199+ shutdown : ShutdownGuard ,
200+ executor : TaskExecutor ,
191201 mut updates : broadcast:: Receiver < DutyBatch > ,
192202 ident_key : IdentityKey ,
193203 sync_man : Arc < SyncManager > ,
@@ -206,7 +216,7 @@ pub fn duty_dispatch_task<
206216 let ( duty_status_tx, duty_status_rx) = std:: sync:: mpsc:: channel :: < DutyExecStatus > ( ) ;
207217
208218 let pending_duties_t = pending_duties. clone ( ) ;
209- std :: thread :: spawn ( move || loop {
219+ executor . spawn_critical ( "pending duty tracker" , move |shutdown | loop {
210220 if let Ok ( DutyExecStatus { id, result } ) = duty_status_rx. recv ( ) {
211221 if let Err ( e) = result {
212222 error ! ( err = %e, "error performing duty" ) ;
@@ -216,10 +226,18 @@ pub fn duty_dispatch_task<
216226 if pending_duties_t. write ( ) . unwrap ( ) . remove ( & id) . is_none ( ) {
217227 warn ! ( %id, "tried to remove non-existent duty" ) ;
218228 }
229+ if shutdown. should_shutdown ( ) {
230+ warn ! ( "received shutdown signal" ) ;
231+ break ;
232+ }
219233 }
220234 } ) ;
221235
222236 loop {
237+ if shutdown. should_shutdown ( ) {
238+ warn ! ( "received shutdown signal" ) ;
239+ break ;
240+ }
223241 let update = match updates. blocking_recv ( ) {
224242 Ok ( u) => u,
225243 Err ( broadcast:: error:: RecvError :: Closed ) => {
0 commit comments