Skip to content

Commit d80bfc0

Browse files
committed
refactor: extract functions in app start
1 parent 56c3bd1 commit d80bfc0

1 file changed

Lines changed: 81 additions & 39 deletions

File tree

src/app.rs

Lines changed: 81 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@
2424
use std::sync::Arc;
2525

2626
use tokio::task::JoinHandle;
27-
use torrust_tracker_configuration::Configuration;
27+
use torrust_tracker_configuration::{Configuration, HttpTracker, UdpTracker};
2828
use tracing::instrument;
2929

30-
use crate::bootstrap;
3130
use crate::bootstrap::jobs::{health_check_api, http_tracker, torrent_cleanup, tracker_apis, udp_tracker};
31+
use crate::bootstrap::{self};
3232
use crate::container::AppContainer;
3333

3434
pub async fn run() -> (Arc<AppContainer>, Vec<JoinHandle<()>>) {
@@ -41,6 +41,8 @@ pub async fn run() -> (Arc<AppContainer>, Vec<JoinHandle<()>>) {
4141
(app_container, jobs)
4242
}
4343

44+
/// Starts the tracker application.
45+
///
4446
/// # Panics
4547
///
4648
/// Will panic if:
@@ -49,16 +51,40 @@ pub async fn run() -> (Arc<AppContainer>, Vec<JoinHandle<()>>) {
4951
/// - Can't load whitelist from database.
5052
#[instrument(skip(config, app_container))]
5153
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) {
5279
if config.http_api.is_none()
5380
&& (config.udp_trackers.is_none() || config.udp_trackers.as_ref().map_or(true, std::vec::Vec::is_empty))
5481
&& (config.http_trackers.is_none() || config.http_trackers.as_ref().map_or(true, std::vec::Vec::is_empty))
5582
{
5683
tracing::warn!("No services enabled in configuration");
5784
}
85+
}
5886

59-
let mut jobs: Vec<JoinHandle<()>> = Vec::new();
60-
61-
// Load peer keys
87+
async fn load_peer_keys(config: &Configuration, app_container: &Arc<AppContainer>) {
6288
if config.core.private {
6389
app_container
6490
.tracker_core_container
@@ -67,8 +93,9 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
6793
.await
6894
.expect("Could not retrieve keys from database.");
6995
}
96+
}
7097

71-
// Load whitelisted torrents
98+
async fn load_whitelisted_torrents(config: &Configuration, app_container: &Arc<AppContainer>) {
7299
if config.core.listed {
73100
app_container
74101
.tracker_core_container
@@ -77,8 +104,9 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
77104
.await
78105
.expect("Could not load whitelist from database.");
79106
}
107+
}
80108

81-
// Start the UDP blocks
109+
async fn start_the_udp_instances(config: &Configuration, app_container: &Arc<AppContainer>, jobs: &mut Vec<JoinHandle<()>>) {
82110
if let Some(udp_trackers) = &config.udp_trackers {
83111
for udp_tracker_config in udp_trackers {
84112
if config.core.private {
@@ -87,47 +115,61 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
87115
udp_tracker_config.bind_address
88116
);
89117
} else {
90-
let udp_tracker_container = app_container
91-
.udp_tracker_container(udp_tracker_config.bind_address)
92-
.expect("Could not create UDP tracker container");
93-
let udp_tracker_server_container = app_container.udp_tracker_server_container();
94-
95-
jobs.push(
96-
udp_tracker::start_job(
97-
udp_tracker_container,
98-
udp_tracker_server_container,
99-
app_container.registar.give_form(),
100-
)
101-
.await,
102-
);
118+
start_udp_instance(udp_tracker_config, app_container, jobs).await;
103119
}
104120
}
105121
} else {
106122
tracing::info!("No UDP blocks in configuration");
107123
}
124+
}
125+
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();
108131

109-
// Start the HTTP blocks
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<()>>) {
110143
if let Some(http_trackers) = &config.http_trackers {
111144
for http_tracker_config in http_trackers {
112-
let http_tracker_container = app_container
113-
.http_tracker_container(http_tracker_config.bind_address)
114-
.expect("Could not create HTTP tracker container");
115-
116-
if let Some(job) = http_tracker::start_job(
117-
http_tracker_container,
118-
app_container.registar.give_form(),
119-
torrust_axum_http_tracker_server::Version::V1,
120-
)
121-
.await
122-
{
123-
jobs.push(job);
124-
}
145+
start_http_instance(http_tracker_config, app_container, jobs).await;
125146
}
126147
} else {
127148
tracing::info!("No HTTP blocks in configuration");
128149
}
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+
}
129171

130-
// Start HTTP API
172+
async fn start_the_http_api(config: &Configuration, app_container: &Arc<AppContainer>, jobs: &mut Vec<JoinHandle<()>>) {
131173
if let Some(http_api_config) = &config.http_api {
132174
let http_api_config = Arc::new(http_api_config.clone());
133175
let http_api_container = app_container.tracker_http_api_container(&http_api_config);
@@ -144,17 +186,17 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
144186
} else {
145187
tracing::info!("No API block in configuration");
146188
}
189+
}
147190

148-
// Start runners to remove torrents without peers, every interval
191+
fn start_torrent_cleanup(config: &Configuration, app_container: &Arc<AppContainer>, jobs: &mut Vec<JoinHandle<()>>) {
149192
if config.core.inactive_peer_cleanup_interval > 0 {
150193
jobs.push(torrent_cleanup::start_job(
151194
&config.core,
152195
&app_container.tracker_core_container.torrents_manager,
153196
));
154197
}
198+
}
155199

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

0 commit comments

Comments
 (0)