@@ -2,15 +2,15 @@ use std::{cmp::min, collections::BTreeSet, sync::Arc, time::Duration};
2
2
3
3
use futures:: stream:: StreamExt ;
4
4
use multisig:: { Committee , PublicKey , Validated } ;
5
- use parking_lot:: RwLock ;
6
- use robusta:: { Height , espresso_types:: NamespaceId } ;
5
+ use parking_lot:: Mutex ;
6
+ use robusta:: espresso_types:: NamespaceId ;
7
7
use timeboost_types:: {
8
8
BlockNumber , CertifiedBlock ,
9
9
sailfish:: { CommitteeVec , Empty } ,
10
10
} ;
11
11
use tokio:: {
12
12
spawn,
13
- sync:: { Mutex , OwnedSemaphorePermit , Semaphore } ,
13
+ sync:: { Mutex as AsyncMutex , OwnedSemaphorePermit , Semaphore } ,
14
14
task:: JoinHandle ,
15
15
time:: { Instant , error:: Elapsed , sleep, timeout} ,
16
16
} ;
@@ -27,7 +27,7 @@ pub struct Submitter {
27
27
verify_task : JoinHandle < Empty > ,
28
28
submitters : TaskTracker ,
29
29
handler : Handler ,
30
- committees : Arc < Mutex < CommitteeVec < 2 > > > ,
30
+ committees : Arc < AsyncMutex < CommitteeVec < 2 > > > ,
31
31
task_permits : Arc < Semaphore > ,
32
32
}
33
33
@@ -40,8 +40,8 @@ impl Drop for Submitter {
40
40
impl Submitter {
41
41
pub async fn create ( cfg : SubmitterConfig ) -> Self {
42
42
let client = robusta:: Client :: new ( cfg. robusta . clone ( ) ) ;
43
- let verified = Arc :: new ( RwLock :: new ( BTreeSet :: new ( ) ) ) ;
44
- let committees = Arc :: new ( Mutex :: new ( CommitteeVec :: new ( cfg. committee . clone ( ) ) ) ) ;
43
+ let verified = Arc :: new ( Mutex :: new ( BTreeSet :: new ( ) ) ) ;
44
+ let committees = Arc :: new ( AsyncMutex :: new ( CommitteeVec :: new ( cfg. committee . clone ( ) ) ) ) ;
45
45
let handler = Handler {
46
46
label : cfg. pubkey ,
47
47
nsid : cfg. namespace ,
@@ -55,21 +55,13 @@ impl Submitter {
55
55
client : client. clone ( ) ,
56
56
verified,
57
57
} ;
58
- let mut delays = cfg. robusta . delay_iter ( ) ;
59
- loop {
60
- let Ok ( height) = client. height ( ) . await else {
61
- let d = delays. next ( ) . expect ( "delay iterator repeats" ) ;
62
- sleep ( d) . await ;
63
- continue ;
64
- } ;
65
- return Submitter {
66
- handler,
67
- config : cfg,
68
- verify_task : spawn ( verifier. verify ( height) ) ,
69
- submitters : TaskTracker :: new ( ) ,
70
- committees,
71
- task_permits : Arc :: new ( Semaphore :: new ( MAX_TASKS ) ) ,
72
- } ;
58
+ Submitter {
59
+ handler,
60
+ config : cfg,
61
+ verify_task : spawn ( verifier. verify ( ) ) ,
62
+ submitters : TaskTracker :: new ( ) ,
63
+ committees,
64
+ task_permits : Arc :: new ( Semaphore :: new ( MAX_TASKS ) ) ,
73
65
}
74
66
}
75
67
@@ -105,12 +97,20 @@ struct Verifier {
105
97
label : PublicKey ,
106
98
nsid : NamespaceId ,
107
99
client : robusta:: Client ,
108
- committees : Arc < Mutex < CommitteeVec < 2 > > > ,
109
- verified : Arc < RwLock < BTreeSet < BlockNumber > > > ,
100
+ committees : Arc < AsyncMutex < CommitteeVec < 2 > > > ,
101
+ verified : Arc < Mutex < BTreeSet < BlockNumber > > > ,
110
102
}
111
103
112
104
impl Verifier {
113
- async fn verify ( self , mut height : Height ) -> Empty {
105
+ async fn verify ( self ) -> Empty {
106
+ let mut delays = self . client . config ( ) . delay_iter ( ) ;
107
+ let mut height = loop {
108
+ if let Ok ( h) = self . client . height ( ) . await {
109
+ break h;
110
+ } ;
111
+ let d = delays. next ( ) . expect ( "delay iterator repeats" ) ;
112
+ sleep ( d) . await ;
113
+ } ;
114
114
loop {
115
115
let mut headers;
116
116
loop {
@@ -122,7 +122,7 @@ impl Verifier {
122
122
while let Some ( h) = headers. next ( ) . await {
123
123
let committees = self . committees . lock ( ) . await ;
124
124
let numbers = self . client . verified ( self . nsid , & h, & committees) . await ;
125
- let mut set = self . verified . write ( ) ;
125
+ let mut set = self . verified . lock ( ) ;
126
126
for n in numbers {
127
127
debug ! ( node = %self . label, num = %n, "verified" ) ;
128
128
if set. len ( ) == CACHE_SIZE {
@@ -141,7 +141,7 @@ struct Handler {
141
141
label : PublicKey ,
142
142
nsid : NamespaceId ,
143
143
client : robusta:: Client ,
144
- verified : Arc < RwLock < BTreeSet < BlockNumber > > > ,
144
+ verified : Arc < Mutex < BTreeSet < BlockNumber > > > ,
145
145
}
146
146
147
147
impl Handler {
@@ -153,6 +153,13 @@ impl Handler {
153
153
}
154
154
155
155
let num = cb. cert ( ) . data ( ) . num ( ) ;
156
+
157
+ // Maybe the block has already been verified?
158
+ if self . verified . lock ( ) . remove ( & num) {
159
+ debug ! ( node = %self . label, %num, "block submission verified" ) ;
160
+ return ;
161
+ }
162
+
156
163
let max_delay = Duration :: from_secs ( 30 ) ;
157
164
let mut state = State :: Submit ( false ) ;
158
165
@@ -175,7 +182,7 @@ impl Handler {
175
182
state = State :: Verify ( delay. saturating_sub ( d) )
176
183
}
177
184
State :: Verify ( delay) => {
178
- if self . verified . read ( ) . contains ( & cb . cert ( ) . data ( ) . num ( ) ) {
185
+ if self . verified . lock ( ) . remove ( & num) {
179
186
debug ! ( node = %self . label, %num, "block submission verified" ) ;
180
187
return ;
181
188
} else {
0 commit comments