@@ -13,7 +13,7 @@ use clap::Parser;
13
13
use config:: { builder:: DefaultState , ConfigBuilder , Map , Source , Value } ;
14
14
15
15
use slog:: { crit, debug, info, warn, Logger } ;
16
- use tokio:: { sync :: oneshot , task:: JoinSet } ;
16
+ use tokio:: task:: JoinSet ;
17
17
18
18
use mithril_cli_helper:: {
19
19
register_config_value, register_config_value_bool, register_config_value_option,
@@ -132,18 +132,23 @@ impl ServeCommand {
132
132
let mut dependencies_builder =
133
133
DependenciesBuilder :: new ( root_logger. clone ( ) , Arc :: new ( config. clone ( ) ) ) ;
134
134
135
- // start servers
136
135
println ! ( "Starting server..." ) ;
137
136
println ! ( "Press Ctrl+C to stop" ) ;
138
137
139
- // start the monitoring thread
138
+ // Create the stop signal channel
139
+ let ( stop_tx, stop_rx) = dependencies_builder
140
+ . get_stop_signal_channel ( )
141
+ . await
142
+ . with_context ( || "Dependencies Builder can not create stop signal channel" ) ?;
143
+
144
+ // Start the monitoring thread
140
145
let mut event_store = dependencies_builder
141
146
. create_event_store ( )
142
147
. await
143
148
. with_context ( || "Dependencies Builder can not create event store" ) ?;
144
149
let event_store_thread = tokio:: spawn ( async move { event_store. run ( ) . await . unwrap ( ) } ) ;
145
150
146
- // start the database vacuum operation, if needed
151
+ // Start the database vacuum operation, if needed
147
152
self . perform_database_vacuum_if_needed (
148
153
& config. data_stores_directory ,
149
154
& mut dependencies_builder,
@@ -152,15 +157,15 @@ impl ServeCommand {
152
157
)
153
158
. await ?;
154
159
155
- // start the aggregator runtime
160
+ // Start the aggregator runtime
156
161
let mut runtime = dependencies_builder
157
162
. create_aggregator_runner ( )
158
163
. await
159
164
. with_context ( || "Dependencies Builder can not create aggregator runner" ) ?;
160
165
let mut join_set = JoinSet :: new ( ) ;
161
166
join_set. spawn ( async move { runtime. run ( ) . await . map_err ( |e| e. to_string ( ) ) } ) ;
162
167
163
- // start the cardano transactions preloader
168
+ // Start the cardano transactions preloader
164
169
let cardano_transactions_preloader = dependencies_builder
165
170
. create_cardano_transactions_preloader ( )
166
171
. await
@@ -170,27 +175,41 @@ impl ServeCommand {
170
175
let preload_task =
171
176
tokio:: spawn ( async move { cardano_transactions_preloader. preload ( ) . await } ) ;
172
177
173
- // start the HTTP server
174
- let ( shutdown_tx, shutdown_rx) = oneshot:: channel ( ) ;
178
+ // Start the HTTP server
175
179
let routes = dependencies_builder
176
180
. create_http_routes ( )
177
181
. await
178
182
. with_context ( || "Dependencies Builder can not create http routes" ) ?;
183
+ let mut stop_rx_clone = stop_rx. clone ( ) ;
179
184
join_set. spawn ( async move {
180
185
let ( _, server) = warp:: serve ( routes) . bind_with_graceful_shutdown (
181
186
(
182
187
config. server_ip . clone ( ) . parse :: < IpAddr > ( ) . unwrap ( ) ,
183
188
config. server_port ,
184
189
) ,
185
- async {
186
- shutdown_rx . await . ok ( ) ;
190
+ async move {
191
+ stop_rx_clone . changed ( ) . await . ok ( ) ;
187
192
} ,
188
193
) ;
189
194
server. await ;
190
195
191
196
Ok ( ( ) )
192
197
} ) ;
193
198
199
+ let signature_processor = dependencies_builder
200
+ . create_signature_processor ( )
201
+ . await
202
+ . with_context ( || "Dependencies Builder can not create signature processor" ) ?;
203
+ let signature_processor_clone = signature_processor. clone ( ) ;
204
+ join_set. spawn ( async move {
205
+ signature_processor_clone
206
+ . run ( )
207
+ . await
208
+ . map_err ( |e| e. to_string ( ) ) ?;
209
+
210
+ Ok ( ( ) )
211
+ } ) ;
212
+
194
213
// Create a SignersImporter only if the `cexplorer_pools_url` is provided in the config.
195
214
if let Some ( cexplorer_pools_url) = config. cexplorer_pools_url {
196
215
match dependencies_builder
@@ -236,7 +255,7 @@ impl ServeCommand {
236
255
. get_metrics_service ( )
237
256
. await
238
257
. with_context ( || "Metrics service initialization error" ) ?;
239
- let ( metrics_server_shutdown_tx , metrics_server_shutdown_rx ) = oneshot :: channel ( ) ;
258
+ let stop_rx_clone = stop_rx . clone ( ) ;
240
259
if config. enable_metrics_server {
241
260
let metrics_logger = root_logger. clone ( ) ;
242
261
join_set. spawn ( async move {
@@ -246,7 +265,7 @@ impl ServeCommand {
246
265
metrics_service,
247
266
metrics_logger. clone ( ) ,
248
267
)
249
- . start ( metrics_server_shutdown_rx )
268
+ . start ( stop_rx_clone )
250
269
. await
251
270
. map_err ( |e| anyhow ! ( e) ) ;
252
271
@@ -261,13 +280,13 @@ impl ServeCommand {
261
280
crit ! ( root_logger, "A critical error occurred" ; "error" => e) ;
262
281
}
263
282
264
- metrics_server_shutdown_tx
265
- . send ( ( ) )
266
- . map_err ( |e| anyhow ! ( "Metrics server shutdown signal could not be sent: {e:?}" ) ) ?;
267
-
268
- // stop servers
283
+ // Stop servers
269
284
join_set. shutdown ( ) . await ;
270
- let _ = shutdown_tx. send ( ( ) ) ;
285
+
286
+ // Send the stop signal
287
+ stop_tx
288
+ . send ( ( ) )
289
+ . map_err ( |e| anyhow ! ( "Stop signal could not be sent: {e:?}" ) ) ?;
271
290
272
291
if !preload_task. is_finished ( ) {
273
292
preload_task. abort ( ) ;
0 commit comments