@@ -10,7 +10,7 @@ use timeboost_types::{
10
10
} ;
11
11
use tokio:: {
12
12
spawn,
13
- sync:: Mutex ,
13
+ sync:: { Mutex , OwnedSemaphorePermit , Semaphore } ,
14
14
task:: JoinHandle ,
15
15
time:: { Instant , error:: Elapsed , sleep, timeout} ,
16
16
} ;
@@ -19,14 +19,16 @@ use tracing::{debug, warn};
19
19
20
20
use crate :: config:: SubmitterConfig ;
21
21
22
- const CACHE_SIZE : usize = 10_000 ;
22
+ const CACHE_SIZE : usize = 15_000 ;
23
+ const MAX_TASKS : usize = 1000 ;
23
24
24
25
pub struct Submitter {
25
26
config : SubmitterConfig ,
26
27
verify_task : JoinHandle < Empty > ,
27
28
submitters : TaskTracker ,
28
29
handler : Handler ,
29
30
committees : Arc < Mutex < CommitteeVec < 2 > > > ,
31
+ task_permits : Arc < Semaphore > ,
30
32
}
31
33
32
34
impl Drop for Submitter {
@@ -66,6 +68,7 @@ impl Submitter {
66
68
verify_task : spawn ( verifier. verify ( height) ) ,
67
69
submitters : TaskTracker :: new ( ) ,
68
70
committees,
71
+ task_permits : Arc :: new ( Semaphore :: new ( MAX_TASKS ) ) ,
69
72
} ;
70
73
}
71
74
}
@@ -78,9 +81,18 @@ impl Submitter {
78
81
self . committees . lock ( ) . await . add ( c) ;
79
82
}
80
83
81
- pub fn submit ( & mut self , cb : CertifiedBlock < Validated > ) {
82
- debug ! ( node = %self . public_key( ) , num = %cb. cert( ) . data( ) . num( ) , "creating block handler" ) ;
83
- self . submitters . spawn ( self . handler . clone ( ) . handle ( cb) ) ;
84
+ pub async fn submit ( & mut self , cb : CertifiedBlock < Validated > ) {
85
+ let Ok ( permit) = Semaphore :: acquire_owned ( self . task_permits . clone ( ) ) . await else {
86
+ return ;
87
+ } ;
88
+ debug ! (
89
+ node = %self . public_key( ) ,
90
+ num = %cb. cert( ) . data( ) . num( ) ,
91
+ tasks = %self . submitters. len( ) ,
92
+ "creating block handler"
93
+ ) ;
94
+ self . submitters
95
+ . spawn ( self . handler . clone ( ) . handle ( permit, cb) ) ;
84
96
}
85
97
86
98
pub async fn join ( self ) {
@@ -133,7 +145,7 @@ struct Handler {
133
145
}
134
146
135
147
impl Handler {
136
- async fn handle ( mut self , cb : CertifiedBlock < Validated > ) {
148
+ async fn handle ( mut self , _ : OwnedSemaphorePermit , cb : CertifiedBlock < Validated > ) {
137
149
enum State {
138
150
Submit ( bool ) ,
139
151
Wait ( Duration ) ,
@@ -281,7 +293,7 @@ mod tests {
281
293
282
294
tasks. spawn ( async move {
283
295
for _ in 0 ..NODES {
284
- s. submit ( g. next ( ) ) ;
296
+ s. submit ( g. next ( ) ) . await ;
285
297
}
286
298
s. join ( ) . await
287
299
} ) ;
0 commit comments