Skip to content

Commit fc78ac8

Browse files
committed
refactor: [torrust#1184] remove stats functionality from core tracker
1 parent c415430 commit fc78ac8

31 files changed

+1147
-538
lines changed

src/app.rs

+16-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ use torrust_tracker_configuration::Configuration;
2929
use tracing::instrument;
3030

3131
use crate::bootstrap::jobs::{health_check_api, http_tracker, torrent_cleanup, tracker_apis, udp_tracker};
32+
use crate::core::statistics::event::sender::Sender;
33+
use crate::core::statistics::repository::Repository;
3234
use crate::servers::registar::Registar;
3335
use crate::servers::udp::server::banning::BanService;
3436
use crate::{core, servers};
@@ -39,11 +41,13 @@ use crate::{core, servers};
3941
///
4042
/// - Can't retrieve tracker keys from database.
4143
/// - Can't load whitelist from database.
42-
#[instrument(skip(config, tracker, ban_service))]
44+
#[instrument(skip(config, tracker, ban_service, stats_event_sender, stats_repository))]
4345
pub async fn start(
4446
config: &Configuration,
4547
tracker: Arc<core::Tracker>,
4648
ban_service: Arc<RwLock<BanService>>,
49+
stats_event_sender: Arc<Option<Box<dyn Sender>>>,
50+
stats_repository: Arc<Repository>,
4751
) -> Vec<JoinHandle<()>> {
4852
if config.http_api.is_none()
4953
&& (config.udp_trackers.is_none() || config.udp_trackers.as_ref().map_or(true, std::vec::Vec::is_empty))
@@ -83,7 +87,14 @@ pub async fn start(
8387
);
8488
} else {
8589
jobs.push(
86-
udp_tracker::start_job(udp_tracker_config, tracker.clone(), ban_service.clone(), registar.give_form()).await,
90+
udp_tracker::start_job(
91+
udp_tracker_config,
92+
tracker.clone(),
93+
stats_event_sender.clone(),
94+
ban_service.clone(),
95+
registar.give_form(),
96+
)
97+
.await,
8798
);
8899
}
89100
}
@@ -97,6 +108,7 @@ pub async fn start(
97108
if let Some(job) = http_tracker::start_job(
98109
http_tracker_config,
99110
tracker.clone(),
111+
stats_event_sender.clone(),
100112
registar.give_form(),
101113
servers::http::Version::V1,
102114
)
@@ -115,6 +127,8 @@ pub async fn start(
115127
http_api_config,
116128
tracker.clone(),
117129
ban_service.clone(),
130+
stats_event_sender.clone(),
131+
stats_repository.clone(),
118132
registar.give_form(),
119133
servers::apis::Version::V1,
120134
)

src/bootstrap/app.rs

+20-17
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,15 @@ use crate::shared::crypto::keys::{self, Keeper as _};
3838
///
3939
/// Setup can file if the configuration is invalid.
4040
#[must_use]
41+
#[allow(clippy::type_complexity)]
4142
#[instrument(skip())]
42-
pub fn setup() -> (Configuration, Arc<Tracker>, Arc<RwLock<BanService>>) {
43+
pub fn setup() -> (
44+
Configuration,
45+
Arc<Tracker>,
46+
Arc<RwLock<BanService>>,
47+
Arc<Option<Box<dyn Sender>>>,
48+
Arc<Repository>,
49+
) {
4350
#[cfg(not(test))]
4451
check_seed();
4552

@@ -49,13 +56,19 @@ pub fn setup() -> (Configuration, Arc<Tracker>, Arc<RwLock<BanService>>) {
4956
panic!("Configuration error: {e}");
5057
}
5158

52-
let tracker = initialize_with_configuration(&configuration);
59+
// Initialize services
60+
61+
let (stats_event_sender, stats_repository) = statistics::setup::factory(configuration.core.tracker_usage_statistics);
62+
let stats_event_sender = Arc::new(stats_event_sender);
63+
let stats_repository = Arc::new(stats_repository);
5364

5465
let udp_ban_service = Arc::new(RwLock::new(BanService::new(MAX_CONNECTION_ID_ERRORS_PER_IP)));
5566

67+
let tracker = initialize_with_configuration(&configuration);
68+
5669
tracing::info!("Configuration:\n{}", configuration.clone().mask_secrets().to_json());
5770

58-
(configuration, tracker, udp_ban_service)
71+
(configuration, tracker, udp_ban_service, stats_event_sender, stats_repository)
5972
}
6073

6174
/// checks if the seed is the instance seed in production.
@@ -109,28 +122,18 @@ pub fn initialize_static() {
109122
#[must_use]
110123
#[instrument(skip(config))]
111124
pub fn initialize_tracker(config: &Configuration) -> Tracker {
112-
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(config);
125+
let (database, whitelist_manager) = initialize_tracker_dependencies(config);
113126

114-
tracker_factory(config, &database, &whitelist_manager, &stats_event_sender, &stats_repository)
127+
tracker_factory(config, &database, &whitelist_manager)
115128
}
116129

117130
#[allow(clippy::type_complexity)]
118131
#[must_use]
119-
pub fn initialize_tracker_dependencies(
120-
config: &Configuration,
121-
) -> (
122-
Arc<Box<dyn Database>>,
123-
Arc<WhiteListManager>,
124-
Arc<Option<Box<dyn Sender>>>,
125-
Arc<Repository>,
126-
) {
132+
pub fn initialize_tracker_dependencies(config: &Configuration) -> (Arc<Box<dyn Database>>, Arc<WhiteListManager>) {
127133
let database = initialize_database(config);
128134
let whitelist_manager = initialize_whitelist(database.clone());
129-
let (stats_event_sender, stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
130-
let stats_event_sender = Arc::new(stats_event_sender);
131-
let stats_repository = Arc::new(stats_repository);
132135

133-
(database, whitelist_manager, stats_event_sender, stats_repository)
136+
(database, whitelist_manager)
134137
}
135138

136139
/// It initializes the log threshold, format and channel.

src/bootstrap/jobs/http_tracker.rs

+13-6
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ use torrust_tracker_configuration::HttpTracker;
1919
use tracing::instrument;
2020

2121
use super::make_rust_tls;
22-
use crate::core;
22+
use crate::core::statistics::event::sender::Sender;
23+
use crate::core::{self, statistics};
2324
use crate::servers::http::server::{HttpServer, Launcher};
2425
use crate::servers::http::Version;
2526
use crate::servers::registar::ServiceRegistrationForm;
@@ -33,10 +34,11 @@ use crate::servers::registar::ServiceRegistrationForm;
3334
///
3435
/// It would panic if the `config::HttpTracker` struct would contain inappropriate values.
3536
///
36-
#[instrument(skip(config, tracker, form))]
37+
#[instrument(skip(config, tracker, stats_event_sender, form))]
3738
pub async fn start_job(
3839
config: &HttpTracker,
3940
tracker: Arc<core::Tracker>,
41+
stats_event_sender: Arc<Option<Box<dyn Sender>>>,
4042
form: ServiceRegistrationForm,
4143
version: Version,
4244
) -> Option<JoinHandle<()>> {
@@ -47,20 +49,21 @@ pub async fn start_job(
4749
.map(|tls| tls.expect("it should have a valid http tracker tls configuration"));
4850

4951
match version {
50-
Version::V1 => Some(start_v1(socket, tls, tracker.clone(), form).await),
52+
Version::V1 => Some(start_v1(socket, tls, tracker.clone(), stats_event_sender.clone(), form).await),
5153
}
5254
}
5355

5456
#[allow(clippy::async_yields_async)]
55-
#[instrument(skip(socket, tls, tracker, form))]
57+
#[instrument(skip(socket, tls, tracker, stats_event_sender, form))]
5658
async fn start_v1(
5759
socket: SocketAddr,
5860
tls: Option<RustlsConfig>,
5961
tracker: Arc<core::Tracker>,
62+
stats_event_sender: Arc<Option<Box<dyn statistics::event::sender::Sender>>>,
6063
form: ServiceRegistrationForm,
6164
) -> JoinHandle<()> {
6265
let server = HttpServer::new(Launcher::new(socket, tls))
63-
.start(tracker, form)
66+
.start(tracker, stats_event_sender, form)
6467
.await
6568
.expect("it should be able to start to the http tracker");
6669

@@ -85,6 +88,7 @@ mod tests {
8588

8689
use crate::bootstrap::app::initialize_with_configuration;
8790
use crate::bootstrap::jobs::http_tracker::start_job;
91+
use crate::core::services::statistics;
8892
use crate::servers::http::Version;
8993
use crate::servers::registar::Registar;
9094

@@ -93,10 +97,13 @@ mod tests {
9397
let cfg = Arc::new(ephemeral_public());
9498
let http_tracker = cfg.http_trackers.clone().expect("missing HTTP tracker configuration");
9599
let config = &http_tracker[0];
100+
let (stats_event_sender, stats_repository) = statistics::setup::factory(cfg.core.tracker_usage_statistics);
101+
let stats_event_sender = Arc::new(stats_event_sender);
102+
let _stats_repository = Arc::new(stats_repository);
96103
let tracker = initialize_with_configuration(&cfg);
97104
let version = Version::V1;
98105

99-
start_job(config, tracker, Registar::default().give_form(), version)
106+
start_job(config, tracker, stats_event_sender, Registar::default().give_form(), version)
100107
.await
101108
.expect("it should be able to join to the http tracker start-job");
102109
}

src/bootstrap/jobs/tracker_apis.rs

+58-8
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ use tracing::instrument;
3131

3232
use super::make_rust_tls;
3333
use crate::core;
34+
use crate::core::statistics::event::sender::Sender;
35+
use crate::core::statistics::repository::Repository;
3436
use crate::servers::apis::server::{ApiServer, Launcher};
3537
use crate::servers::apis::Version;
3638
use crate::servers::registar::ServiceRegistrationForm;
@@ -56,11 +58,13 @@ pub struct ApiServerJobStarted();
5658
/// It would panic if unable to send the `ApiServerJobStarted` notice.
5759
///
5860
///
59-
#[instrument(skip(config, tracker, ban_service, form))]
61+
#[instrument(skip(config, tracker, ban_service, stats_event_sender, stats_repository, form))]
6062
pub async fn start_job(
6163
config: &HttpApi,
6264
tracker: Arc<core::Tracker>,
6365
ban_service: Arc<RwLock<BanService>>,
66+
stats_event_sender: Arc<Option<Box<dyn Sender>>>,
67+
stats_repository: Arc<Repository>,
6468
form: ServiceRegistrationForm,
6569
version: Version,
6670
) -> Option<JoinHandle<()>> {
@@ -73,22 +77,53 @@ pub async fn start_job(
7377
let access_tokens = Arc::new(config.access_tokens.clone());
7478

7579
match version {
76-
Version::V1 => Some(start_v1(bind_to, tls, tracker.clone(), ban_service.clone(), form, access_tokens).await),
80+
Version::V1 => Some(
81+
start_v1(
82+
bind_to,
83+
tls,
84+
tracker.clone(),
85+
ban_service.clone(),
86+
stats_event_sender.clone(),
87+
stats_repository.clone(),
88+
form,
89+
access_tokens,
90+
)
91+
.await,
92+
),
7793
}
7894
}
7995

8096
#[allow(clippy::async_yields_async)]
81-
#[instrument(skip(socket, tls, tracker, ban_service, form, access_tokens))]
97+
#[allow(clippy::too_many_arguments)]
98+
#[instrument(skip(
99+
socket,
100+
tls,
101+
tracker,
102+
ban_service,
103+
stats_event_sender,
104+
stats_repository,
105+
form,
106+
access_tokens
107+
))]
82108
async fn start_v1(
83109
socket: SocketAddr,
84110
tls: Option<RustlsConfig>,
85111
tracker: Arc<core::Tracker>,
86112
ban_service: Arc<RwLock<BanService>>,
113+
stats_event_sender: Arc<Option<Box<dyn Sender>>>,
114+
stats_repository: Arc<Repository>,
87115
form: ServiceRegistrationForm,
88116
access_tokens: Arc<AccessTokens>,
89117
) -> JoinHandle<()> {
90118
let server = ApiServer::new(Launcher::new(socket, tls))
91-
.start(tracker, ban_service, form, access_tokens)
119+
.start(
120+
tracker,
121+
stats_event_sender,
122+
stats_repository,
123+
ban_service,
124+
form,
125+
access_tokens,
126+
)
92127
.await
93128
.expect("it should be able to start to the tracker api");
94129

@@ -107,6 +142,7 @@ mod tests {
107142

108143
use crate::bootstrap::app::initialize_with_configuration;
109144
use crate::bootstrap::jobs::tracker_apis::start_job;
145+
use crate::core::services::statistics;
110146
use crate::servers::apis::Version;
111147
use crate::servers::registar::Registar;
112148
use crate::servers::udp::server::banning::BanService;
@@ -116,12 +152,26 @@ mod tests {
116152
async fn it_should_start_http_tracker() {
117153
let cfg = Arc::new(ephemeral_public());
118154
let config = &cfg.http_api.clone().unwrap();
119-
let tracker = initialize_with_configuration(&cfg);
155+
120156
let ban_service = Arc::new(RwLock::new(BanService::new(MAX_CONNECTION_ID_ERRORS_PER_IP)));
157+
let (stats_event_sender, stats_repository) = statistics::setup::factory(cfg.core.tracker_usage_statistics);
158+
let stats_event_sender = Arc::new(stats_event_sender);
159+
let stats_repository = Arc::new(stats_repository);
160+
161+
let tracker = initialize_with_configuration(&cfg);
162+
121163
let version = Version::V1;
122164

123-
start_job(config, tracker, ban_service, Registar::default().give_form(), version)
124-
.await
125-
.expect("it should be able to join to the tracker api start-job");
165+
start_job(
166+
config,
167+
tracker,
168+
ban_service,
169+
stats_event_sender,
170+
stats_repository,
171+
Registar::default().give_form(),
172+
version,
173+
)
174+
.await
175+
.expect("it should be able to join to the tracker api start-job");
126176
}
127177
}

src/bootstrap/jobs/udp_tracker.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use torrust_tracker_configuration::UdpTracker;
1414
use tracing::instrument;
1515

1616
use crate::core;
17+
use crate::core::statistics::event::sender::Sender;
1718
use crate::servers::registar::ServiceRegistrationForm;
1819
use crate::servers::udp::server::banning::BanService;
1920
use crate::servers::udp::server::spawner::Spawner;
@@ -31,18 +32,19 @@ use crate::servers::udp::UDP_TRACKER_LOG_TARGET;
3132
/// It will panic if the task did not finish successfully.
3233
#[must_use]
3334
#[allow(clippy::async_yields_async)]
34-
#[instrument(skip(config, tracker, ban_service, form))]
35+
#[instrument(skip(config, tracker, stats_event_sender, ban_service, form))]
3536
pub async fn start_job(
3637
config: &UdpTracker,
3738
tracker: Arc<core::Tracker>,
39+
stats_event_sender: Arc<Option<Box<dyn Sender>>>,
3840
ban_service: Arc<RwLock<BanService>>,
3941
form: ServiceRegistrationForm,
4042
) -> JoinHandle<()> {
4143
let bind_to = config.bind_address;
4244
let cookie_lifetime = config.cookie_lifetime;
4345

4446
let server = Server::new(Spawner::new(bind_to))
45-
.start(tracker, ban_service, form, cookie_lifetime)
47+
.start(tracker, stats_event_sender, ban_service, form, cookie_lifetime)
4648
.await
4749
.expect("it should be able to start the udp tracker");
4850

src/console/profiling.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,9 @@ pub async fn run() {
179179
return;
180180
};
181181

182-
let (config, tracker, ban_service) = bootstrap::app::setup();
182+
let (config, tracker, ban_service, stats_event_sender, stats_repository) = bootstrap::app::setup();
183183

184-
let jobs = app::start(&config, tracker, ban_service).await;
184+
let jobs = app::start(&config, tracker, ban_service, stats_event_sender, stats_repository).await;
185185

186186
// Run the tracker for a fixed duration
187187
let run_duration = sleep(Duration::from_secs(duration_secs));

0 commit comments

Comments
 (0)