Skip to content

Commit 831f411

Browse files
committed
Merge #1475: Refactor app bootstrapping
d80bfc0 refactor: extract functions in app start (Jose Celano) 56c3bd1 refactor: update logs messages (Jose Celano) 00e43ca refactor: move Registar to AppContainer (Jose Celano) Pull request description: Refactor app bootstrapping before implementing #1444: - [x] Move `Registar` to `AppContainer`. - [x] Extract functions in the `start` function. ACKs for top commit: josecelano: ACK d80bfc0 Tree-SHA512: c42789adc2236fe67f6dfdf9526abfd03ffdf9a97ebeaf38e41ecd07d5c6e0d12a80f3e4124d575b6dc9bcef7471993ed9a3527d7f5e4e327e5c706605b07322
2 parents f8486a9 + d80bfc0 commit 831f411

File tree

5 files changed

+106
-49
lines changed

5 files changed

+106
-49
lines changed

src/app.rs

Lines changed: 87 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -24,44 +24,67 @@
2424
use std::sync::Arc;
2525

2626
use tokio::task::JoinHandle;
27-
use torrust_server_lib::registar::Registar;
28-
use torrust_tracker_configuration::Configuration;
27+
use torrust_tracker_configuration::{Configuration, HttpTracker, UdpTracker};
2928
use tracing::instrument;
3029

31-
use crate::bootstrap;
3230
use crate::bootstrap::jobs::{health_check_api, http_tracker, torrent_cleanup, tracker_apis, udp_tracker};
31+
use crate::bootstrap::{self};
3332
use crate::container::AppContainer;
3433

35-
pub async fn run() -> (Arc<AppContainer>, Vec<JoinHandle<()>>, Registar) {
34+
pub async fn run() -> (Arc<AppContainer>, Vec<JoinHandle<()>>) {
3635
let (config, app_container) = bootstrap::app::setup();
3736

3837
let app_container = Arc::new(app_container);
3938

40-
let (jobs, registar) = start(&config, &app_container).await;
39+
let jobs = start(&config, &app_container).await;
4140

42-
(app_container, jobs, registar)
41+
(app_container, jobs)
4342
}
4443

44+
/// Starts the tracker application.
45+
///
4546
/// # Panics
4647
///
4748
/// Will panic if:
4849
///
4950
/// - Can't retrieve tracker keys from database.
5051
/// - Can't load whitelist from database.
5152
#[instrument(skip(config, app_container))]
52-
pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) -> (Vec<JoinHandle<()>>, Registar) {
53+
pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) -> Vec<JoinHandle<()>> {
54+
warn_if_no_services_enabled(config);
55+
56+
load_data_from_database(config, app_container).await;
57+
58+
start_jobs(config, app_container).await
59+
}
60+
61+
async fn load_data_from_database(config: &Configuration, app_container: &Arc<AppContainer>) {
62+
load_peer_keys(config, app_container).await;
63+
load_whitelisted_torrents(config, app_container).await;
64+
}
65+
66+
async fn start_jobs(config: &Configuration, app_container: &Arc<AppContainer>) -> Vec<JoinHandle<()>> {
67+
let mut jobs: Vec<JoinHandle<()>> = Vec::new();
68+
69+
start_the_udp_instances(config, app_container, &mut jobs).await;
70+
start_the_http_instances(config, app_container, &mut jobs).await;
71+
start_the_http_api(config, app_container, &mut jobs).await;
72+
start_torrent_cleanup(config, app_container, &mut jobs);
73+
start_health_check_api(config, app_container, &mut jobs).await;
74+
75+
jobs
76+
}
77+
78+
fn warn_if_no_services_enabled(config: &Configuration) {
5379
if config.http_api.is_none()
5480
&& (config.udp_trackers.is_none() || config.udp_trackers.as_ref().map_or(true, std::vec::Vec::is_empty))
5581
&& (config.http_trackers.is_none() || config.http_trackers.as_ref().map_or(true, std::vec::Vec::is_empty))
5682
{
5783
tracing::warn!("No services enabled in configuration");
5884
}
85+
}
5986

60-
let mut jobs: Vec<JoinHandle<()>> = Vec::new();
61-
62-
let registar = Registar::default();
63-
64-
// Load peer keys
87+
async fn load_peer_keys(config: &Configuration, app_container: &Arc<AppContainer>) {
6588
if config.core.private {
6689
app_container
6790
.tracker_core_container
@@ -70,8 +93,9 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
7093
.await
7194
.expect("Could not retrieve keys from database.");
7295
}
96+
}
7397

74-
// Load whitelisted torrents
98+
async fn load_whitelisted_torrents(config: &Configuration, app_container: &Arc<AppContainer>) {
7599
if config.core.listed {
76100
app_container
77101
.tracker_core_container
@@ -80,8 +104,9 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
80104
.await
81105
.expect("Could not load whitelist from database.");
82106
}
107+
}
83108

84-
// Start the UDP blocks
109+
async fn start_the_udp_instances(config: &Configuration, app_container: &Arc<AppContainer>, jobs: &mut Vec<JoinHandle<()>>) {
85110
if let Some(udp_trackers) = &config.udp_trackers {
86111
for udp_tracker_config in udp_trackers {
87112
if config.core.private {
@@ -90,49 +115,68 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
90115
udp_tracker_config.bind_address
91116
);
92117
} else {
93-
let udp_tracker_container = app_container
94-
.udp_tracker_container(udp_tracker_config.bind_address)
95-
.expect("Could not create UDP tracker container");
96-
let udp_tracker_server_container = app_container.udp_tracker_server_container();
97-
98-
jobs.push(
99-
udp_tracker::start_job(udp_tracker_container, udp_tracker_server_container, registar.give_form()).await,
100-
);
118+
start_udp_instance(udp_tracker_config, app_container, jobs).await;
101119
}
102120
}
103121
} else {
104122
tracing::info!("No UDP blocks in configuration");
105123
}
124+
}
106125

107-
// Start the HTTP blocks
126+
async fn start_udp_instance(udp_tracker_config: &UdpTracker, app_container: &Arc<AppContainer>, jobs: &mut Vec<JoinHandle<()>>) {
127+
let udp_tracker_container = app_container
128+
.udp_tracker_container(udp_tracker_config.bind_address)
129+
.expect("Could not create UDP tracker container");
130+
let udp_tracker_server_container = app_container.udp_tracker_server_container();
131+
132+
jobs.push(
133+
udp_tracker::start_job(
134+
udp_tracker_container,
135+
udp_tracker_server_container,
136+
app_container.registar.give_form(),
137+
)
138+
.await,
139+
);
140+
}
141+
142+
async fn start_the_http_instances(config: &Configuration, app_container: &Arc<AppContainer>, jobs: &mut Vec<JoinHandle<()>>) {
108143
if let Some(http_trackers) = &config.http_trackers {
109144
for http_tracker_config in http_trackers {
110-
let http_tracker_container = app_container
111-
.http_tracker_container(http_tracker_config.bind_address)
112-
.expect("Could not create HTTP tracker container");
113-
114-
if let Some(job) = http_tracker::start_job(
115-
http_tracker_container,
116-
registar.give_form(),
117-
torrust_axum_http_tracker_server::Version::V1,
118-
)
119-
.await
120-
{
121-
jobs.push(job);
122-
}
145+
start_http_instance(http_tracker_config, app_container, jobs).await;
123146
}
124147
} else {
125148
tracing::info!("No HTTP blocks in configuration");
126149
}
150+
}
151+
152+
async fn start_http_instance(
153+
http_tracker_config: &HttpTracker,
154+
app_container: &Arc<AppContainer>,
155+
jobs: &mut Vec<JoinHandle<()>>,
156+
) {
157+
let http_tracker_container = app_container
158+
.http_tracker_container(http_tracker_config.bind_address)
159+
.expect("Could not create HTTP tracker container");
160+
161+
if let Some(job) = http_tracker::start_job(
162+
http_tracker_container,
163+
app_container.registar.give_form(),
164+
torrust_axum_http_tracker_server::Version::V1,
165+
)
166+
.await
167+
{
168+
jobs.push(job);
169+
}
170+
}
127171

128-
// Start HTTP API
172+
async fn start_the_http_api(config: &Configuration, app_container: &Arc<AppContainer>, jobs: &mut Vec<JoinHandle<()>>) {
129173
if let Some(http_api_config) = &config.http_api {
130174
let http_api_config = Arc::new(http_api_config.clone());
131175
let http_api_container = app_container.tracker_http_api_container(&http_api_config);
132176

133177
if let Some(job) = tracker_apis::start_job(
134178
http_api_container,
135-
registar.give_form(),
179+
app_container.registar.give_form(),
136180
torrust_axum_rest_tracker_api_server::Version::V1,
137181
)
138182
.await
@@ -142,17 +186,17 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
142186
} else {
143187
tracing::info!("No API block in configuration");
144188
}
189+
}
145190

146-
// Start runners to remove torrents without peers, every interval
191+
fn start_torrent_cleanup(config: &Configuration, app_container: &Arc<AppContainer>, jobs: &mut Vec<JoinHandle<()>>) {
147192
if config.core.inactive_peer_cleanup_interval > 0 {
148193
jobs.push(torrent_cleanup::start_job(
149194
&config.core,
150195
&app_container.tracker_core_container.torrents_manager,
151196
));
152197
}
198+
}
153199

154-
// Start Health Check API
155-
jobs.push(health_check_api::start_job(&config.health_check_api, registar.entries()).await);
156-
157-
(jobs, registar)
200+
async fn start_health_check_api(config: &Configuration, app_container: &Arc<AppContainer>, jobs: &mut Vec<JoinHandle<()>>) {
201+
jobs.push(health_check_api::start_job(&config.health_check_api, app_container.registar.entries()).await);
158202
}

src/console/profiling.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ pub async fn run() {
179179
return;
180180
};
181181

182-
let (_app_container, jobs, _registar) = app::run().await;
182+
let (_app_container, jobs) = app::run().await;
183183

184184
// Run the tracker for a fixed duration
185185
let run_duration = sleep(Duration::from_secs(duration_secs));
@@ -189,7 +189,8 @@ pub async fn run() {
189189
tracing::info!("Torrust timed shutdown..");
190190
},
191191
_ = tokio::signal::ctrl_c() => {
192-
tracing::info!("Torrust shutting down via Ctrl+C ...");
192+
tracing::info!("Torrust tracker shutting down via Ctrl+C ...");
193+
193194
// Await for all jobs to shutdown
194195
futures::future::join_all(jobs).await;
195196
}

src/container.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use bittorrent_tracker_core::container::TrackerCoreContainer;
77
use bittorrent_udp_tracker_core::container::{UdpTrackerCoreContainer, UdpTrackerCoreServices};
88
use bittorrent_udp_tracker_core::{self};
99
use torrust_rest_tracker_api_core::container::TrackerHttpApiCoreContainer;
10+
use torrust_server_lib::registar::Registar;
1011
use torrust_tracker_configuration::{Configuration, HttpApi};
1112
use torrust_udp_tracker_server::container::UdpTrackerServerContainer;
1213
use tracing::instrument;
@@ -24,6 +25,9 @@ pub struct AppContainer {
2425
// Configuration
2526
pub http_api_config: Arc<Option<HttpApi>>,
2627

28+
// Registar
29+
pub registar: Arc<Registar>,
30+
2731
// Core
2832
pub tracker_core_container: Arc<TrackerCoreContainer>,
2933

@@ -46,6 +50,10 @@ impl AppContainer {
4650

4751
let http_api_config = Arc::new(configuration.http_api.clone());
4852

53+
// Registar
54+
55+
let registar = Arc::new(Registar::default());
56+
4957
// Core
5058

5159
let tracker_core_container = Arc::new(TrackerCoreContainer::initialize(&core_config));
@@ -73,6 +81,9 @@ impl AppContainer {
7381
// Configuration
7482
http_api_config,
7583

84+
// Registar
85+
registar,
86+
7687
// Core
7788
tracker_core_container,
7889

src/main.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@ use torrust_tracker_lib::app;
22

33
#[tokio::main]
44
async fn main() {
5-
let (_app_container, jobs, _registar) = app::run().await;
5+
let (_app_container, jobs) = app::run().await;
66

77
// handle the signals
88
tokio::select! {
99
_ = tokio::signal::ctrl_c() => {
10-
tracing::info!("Torrust shutting down ...");
10+
tracing::info!("Torrust tracker shutting down ...");
1111

1212
// Await for all jobs to shutdown
1313
futures::future::join_all(jobs).await;
14-
tracing::info!("Torrust successfully shutdown.");
14+
15+
tracing::info!("Torrust tracker successfully shutdown.");
1516
}
1617
}
1718
}

tests/servers/api/contract/stats/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ async fn the_stats_api_endpoint_should_return_the_global_stats() {
5151

5252
env::set_var("TORRUST_TRACKER_CONFIG_TOML", config_with_two_http_trackers);
5353

54-
let (_app_container, _jobs, _registar) = app::run().await;
54+
let (_app_container, _jobs) = app::run().await;
5555

5656
announce_to_tracker("http://127.0.0.1:7272").await;
5757
announce_to_tracker("http://127.0.0.1:7373").await;

0 commit comments

Comments
 (0)