1+ use std:: mem;
12use std:: net:: SocketAddr ;
23use std:: process:: exit;
34use std:: sync:: Arc ;
@@ -8,6 +9,7 @@ use futures_util::future::{try_join_all, TryJoinAll};
89use log:: { error, info} ;
910use parking_lot:: deadlock;
1011use sentry:: ClientInitGuard ;
12+ use tokio:: runtime:: Builder ;
1113use tokio_shutdown:: Shutdown ;
1214use torrust_actix:: api:: api:: api_service;
1315use torrust_actix:: common:: common:: { setup_logging, shutdown_waiting, udp_check_host_and_port_used} ;
@@ -82,10 +84,12 @@ fn main() -> std::io::Result<()>
8284
8385 if args. import { tracker. import ( & args, tracker. clone ( ) ) . await ; }
8486
87+ let tokio_core = Builder :: new_multi_thread ( ) . thread_name ( "core" ) . worker_threads ( 9 ) . enable_all ( ) . build ( ) ?;
88+
8589 let tokio_shutdown = Shutdown :: new ( ) . expect ( "shutdown creation works on first call" ) ;
8690
8791 let deadlocks_handler = tokio_shutdown. clone ( ) ;
88- tokio :: spawn ( async move {
92+ tokio_core . spawn ( async move {
8993 info ! ( "[BOOT] Starting thread for deadlocks..." ) ;
9094 loop {
9195 if shutdown_waiting ( Duration :: from_secs ( 10 ) , deadlocks_handler. clone ( ) ) . await {
@@ -136,12 +140,12 @@ fn main() -> std::io::Result<()>
136140 }
137141 }
138142 if !api_futures. is_empty ( ) {
139- tokio :: spawn ( async move {
143+ tokio_core . spawn ( async move {
140144 let _ = try_join_all ( api_futures) . await ;
141145 } ) ;
142146 }
143147 if !apis_futures. is_empty ( ) {
144- tokio :: spawn ( async move {
148+ tokio_core . spawn ( async move {
145149 let _ = try_join_all ( apis_futures) . await ;
146150 } ) ;
147151 }
@@ -174,12 +178,12 @@ fn main() -> std::io::Result<()>
174178 }
175179 }
176180 if !http_futures. is_empty ( ) {
177- tokio :: spawn ( async move {
181+ tokio_core . spawn ( async move {
178182 let _ = try_join_all ( http_futures) . await ;
179183 } ) ;
180184 }
181185 if !https_futures. is_empty ( ) {
182- tokio :: spawn ( async move {
186+ tokio_core . spawn ( async move {
183187 let _ = try_join_all ( https_futures) . await ;
184188 } ) ;
185189 }
@@ -199,7 +203,7 @@ fn main() -> std::io::Result<()>
199203 let stats_handler = tokio_shutdown. clone ( ) ;
200204 let tracker_spawn_stats = tracker. clone ( ) ;
201205 info ! ( "[BOOT] Starting thread for console updates with {} seconds delay..." , tracker_spawn_stats. config. log_console_interval) ;
202- tokio :: spawn ( async move {
206+ tokio_core . spawn ( async move {
203207 loop {
204208 tracker_spawn_stats. set_stats ( StatsEvent :: TimestampSave , chrono:: Utc :: now ( ) . timestamp ( ) + 60i64 ) ;
205209 if shutdown_waiting ( Duration :: from_secs ( tracker_spawn_stats. config . log_console_interval ) , stats_handler. clone ( ) ) . await {
@@ -217,34 +221,17 @@ fn main() -> std::io::Result<()>
217221 }
218222 } ) ;
219223
220- let cleanup_peers_handler = tokio_shutdown. clone ( ) ;
221- let tracker_spawn_cleanup_peers = tracker. clone ( ) ;
222- info ! ( "[BOOT] Starting thread for peers cleanup with {} seconds delay..." , tracker_spawn_cleanup_peers. config. tracker_config. clone( ) . peers_cleanup_interval) ;
223- tokio:: spawn ( async move {
224- loop {
225- tracker_spawn_cleanup_peers. set_stats ( StatsEvent :: TimestampTimeout , chrono:: Utc :: now ( ) . timestamp ( ) + tracker_spawn_cleanup_peers. config . tracker_config . clone ( ) . peers_cleanup_interval as i64 ) ;
226- if shutdown_waiting ( Duration :: from_secs ( tracker_spawn_cleanup_peers. config . tracker_config . clone ( ) . peers_cleanup_interval ) , cleanup_peers_handler. clone ( ) ) . await {
227- info ! ( "[BOOT] Shutting down thread for peers cleanup..." ) ;
228- return ;
229- }
230-
231- info ! ( "[PEERS] Checking now for dead peers." ) ;
232- let _ = tracker_spawn_cleanup_peers. torrent_peers_cleanup ( tracker_spawn_cleanup_peers. clone ( ) , Duration :: from_secs ( tracker_spawn_cleanup_peers. config . tracker_config . clone ( ) . peers_timeout ) , tracker_spawn_cleanup_peers. config . database . clone ( ) . persistent ) . await ;
233- info ! ( "[PEERS] Peers cleaned up." ) ;
234-
235- if tracker_spawn_cleanup_peers. config . tracker_config . clone ( ) . users_enabled {
236- info ! ( "[USERS] Checking now for inactive torrents in users." ) ;
237- tracker_spawn_cleanup_peers. clean_user_active_torrents ( Duration :: from_secs ( tracker_spawn_cleanup_peers. config . tracker_config . clone ( ) . peers_timeout ) ) ;
238- info ! ( "[USERS] Inactive torrents in users cleaned up." ) ;
239- }
240- }
224+ let ( tracker_cleanup_clone, tokio_shutdown_cleanup_clone) = ( tracker. clone ( ) , tokio_shutdown. clone ( ) ) ;
225+ info ! ( "[BOOT] Starting thread for peers cleanup with {} seconds delay..." , tracker_cleanup_clone. config. tracker_config. clone( ) . peers_cleanup_interval) ;
226+ tokio_core. spawn ( async move {
227+ tracker_cleanup_clone. clone ( ) . torrents_sharding . cleanup_threads ( tracker_cleanup_clone. clone ( ) , tokio_shutdown_cleanup_clone, Duration :: from_secs ( tracker_cleanup_clone. config . tracker_config . clone ( ) . peers_timeout ) , tracker_cleanup_clone. config . database . clone ( ) . persistent ) . await ;
241228 } ) ;
242229
243230 if tracker. config . tracker_config . clone ( ) . keys_enabled {
244231 let cleanup_keys_handler = tokio_shutdown. clone ( ) ;
245232 let tracker_spawn_cleanup_keys = tracker. clone ( ) ;
246233 info ! ( "[BOOT] Starting thread for keys cleanup with {} seconds delay..." , tracker_spawn_cleanup_keys. config. tracker_config. clone( ) . keys_cleanup_interval) ;
247- tokio :: spawn ( async move {
234+ tokio_core . spawn ( async move {
248235 loop {
249236 tracker_spawn_cleanup_keys. set_stats ( StatsEvent :: TimestampKeysTimeout , chrono:: Utc :: now ( ) . timestamp ( ) + tracker_spawn_cleanup_keys. config . tracker_config . clone ( ) . keys_cleanup_interval as i64 ) ;
250237 if shutdown_waiting ( Duration :: from_secs ( tracker_spawn_cleanup_keys. config . tracker_config . clone ( ) . keys_cleanup_interval ) , cleanup_keys_handler. clone ( ) ) . await {
@@ -263,7 +250,7 @@ fn main() -> std::io::Result<()>
263250 let updates_handler = tokio_shutdown. clone ( ) ;
264251 let tracker_spawn_updates = tracker. clone ( ) ;
265252 info ! ( "[BOOT] Starting thread for database updates with {} seconds delay..." , tracker_spawn_updates. config. database. clone( ) . persistent_interval) ;
266- tokio :: spawn ( async move {
253+ tokio_core . spawn ( async move {
267254 loop {
268255 tracker_spawn_updates. set_stats ( StatsEvent :: TimestampSave , chrono:: Utc :: now ( ) . timestamp ( ) + tracker_spawn_updates. config . database . clone ( ) . persistent_interval as i64 ) ;
269256 if shutdown_waiting ( Duration :: from_secs ( tracker_spawn_updates. config . database . clone ( ) . persistent_interval ) , updates_handler. clone ( ) ) . await {
@@ -357,6 +344,7 @@ fn main() -> std::io::Result<()>
357344 task:: sleep( Duration :: from_secs( 1 ) ) . await ;
358345
359346 info!( "Server shutting down completed" ) ;
347+ mem:: forget( tokio_core) ;
360348 Ok ( ( ) )
361349 }
362350 }
0 commit comments