@@ -42,7 +42,7 @@ use fuel_web_utils::{
42
42
telemetry:: Telemetry ,
43
43
} ;
44
44
use futures:: { future:: try_join_all, StreamExt } ;
45
- use tokio:: { sync :: Semaphore , task:: JoinError } ;
45
+ use tokio:: task:: { JoinError , JoinSet } ;
46
46
use tokio_util:: sync:: CancellationToken ;
47
47
48
48
use super :: {
@@ -60,7 +60,6 @@ pub struct BlockExecutor {
60
60
db : Arc < Db > ,
61
61
message_broker : Arc < NatsMessageBroker > ,
62
62
fuel_streams : Arc < FuelStreams > ,
63
- semaphore : Arc < Semaphore > ,
64
63
telemetry : Arc < Telemetry < Metrics > > ,
65
64
concurrent_tasks : usize ,
66
65
}
@@ -73,10 +72,8 @@ impl BlockExecutor {
73
72
telemetry : Arc < Telemetry < Metrics > > ,
74
73
concurrent_tasks : usize ,
75
74
) -> Self {
76
- let semaphore = Arc :: new ( Semaphore :: new ( concurrent_tasks) ) ;
77
75
Self {
78
76
db,
79
- semaphore,
80
77
message_broker : message_broker. clone ( ) ,
81
78
fuel_streams : fuel_streams. clone ( ) ,
82
79
telemetry,
@@ -96,14 +93,13 @@ impl BlockExecutor {
96
93
97
94
while !token. is_cancelled ( ) {
98
95
let mut messages = queue. subscribe ( self . concurrent_tasks ) . await ?;
96
+ let mut join_set = JoinSet :: new ( ) ;
99
97
while let Some ( msg) = messages. next ( ) . await {
100
98
let msg = msg?;
101
- let semaphore = self . semaphore . clone ( ) ;
102
- let permit = match semaphore. clone ( ) . acquire_owned ( ) . await {
103
- Ok ( p) => p,
104
- Err ( _) => continue ,
105
- } ;
106
- self . spawn_processing_tasks ( msg, permit) . await ?;
99
+ self . spawn_processing_tasks ( msg, & mut join_set) . await ?;
100
+ }
101
+ while let Some ( result) = join_set. join_next ( ) . await {
102
+ result??;
107
103
}
108
104
}
109
105
@@ -116,7 +112,7 @@ impl BlockExecutor {
116
112
async fn spawn_processing_tasks (
117
113
& self ,
118
114
msg : Box < dyn NatsMessage > ,
119
- permit : tokio :: sync :: OwnedSemaphorePermit ,
115
+ join_set : & mut JoinSet < Result < ( ) , ConsumerError > > ,
120
116
) -> Result < ( ) , ConsumerError > {
121
117
let db = self . db . clone ( ) ;
122
118
let fuel_streams = self . fuel_streams . clone ( ) ;
@@ -125,7 +121,7 @@ impl BlockExecutor {
125
121
let packets = Self :: build_packets ( & msg_payload) ;
126
122
let telemetry = self . telemetry . clone ( ) ;
127
123
128
- tokio :: spawn ( {
124
+ join_set . spawn ( {
129
125
let packets: Arc < Vec < RecordPacket > > = packets. clone ( ) ;
130
126
let msg_payload = msg_payload. clone ( ) ;
131
127
let telemetry = telemetry. clone ( ) ;
@@ -148,15 +144,12 @@ impl BlockExecutor {
148
144
"[#{}] Message acknowledged" ,
149
145
msg_payload. block_height( )
150
146
) ;
151
- drop ( permit) ;
152
- return ;
147
+ return Ok ( ( ) ) ;
153
148
}
154
149
let _ =
155
150
handle_streams_task ( & fuel_streams, & packets, & msg_payload)
156
151
. await ;
157
152
let result = handle_stores ( & db, & packets, & msg_payload) . await ;
158
- // Drop semaphore as soon as store is completed
159
- drop ( permit) ;
160
153
let result = match result {
161
154
Ok ( stats) => {
162
155
if stats. error . is_none ( ) {
@@ -182,9 +175,9 @@ impl BlockExecutor {
182
175
Ok ( Ok :: < _ , ConsumerError > ( ProcessResult :: Store ( result) ) ) ,
183
176
& telemetry,
184
177
) ;
178
+ Ok ( ( ) )
185
179
}
186
180
} ) ;
187
-
188
181
Ok ( ( ) )
189
182
}
190
183
0 commit comments