Skip to content

Commit 5c6045b

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

File tree

26 files changed

+496
-304
lines changed

26 files changed

+496
-304
lines changed

src/app.rs

+7-1
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))
@@ -115,6 +119,8 @@ pub async fn start(
115119
http_api_config,
116120
tracker.clone(),
117121
ban_service.clone(),
122+
stats_event_sender.clone(),
123+
stats_repository.clone(),
118124
registar.give_form(),
119125
servers::apis::Version::V1,
120126
)

src/bootstrap/app.rs

+19-17
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,13 @@ use crate::shared::crypto::keys::{self, Keeper as _};
3939
/// Setup can file if the configuration is invalid.
4040
#[must_use]
4141
#[instrument(skip())]
42-
pub fn setup() -> (Configuration, Arc<Tracker>, Arc<RwLock<BanService>>) {
42+
pub fn setup() -> (
43+
Configuration,
44+
Arc<Tracker>,
45+
Arc<RwLock<BanService>>,
46+
Arc<Option<Box<dyn Sender>>>,
47+
Arc<Repository>,
48+
) {
4349
#[cfg(not(test))]
4450
check_seed();
4551

@@ -49,13 +55,19 @@ pub fn setup() -> (Configuration, Arc<Tracker>, Arc<RwLock<BanService>>) {
4955
panic!("Configuration error: {e}");
5056
}
5157

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

5464
let udp_ban_service = Arc::new(RwLock::new(BanService::new(MAX_CONNECTION_ID_ERRORS_PER_IP)));
5565

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

58-
(configuration, tracker, udp_ban_service)
70+
(configuration, tracker, udp_ban_service, stats_event_sender, stats_repository)
5971
}
6072

6173
/// checks if the seed is the instance seed in production.
@@ -109,28 +121,18 @@ pub fn initialize_static() {
109121
#[must_use]
110122
#[instrument(skip(config))]
111123
pub fn initialize_tracker(config: &Configuration) -> Tracker {
112-
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(config);
124+
let (database, whitelist_manager) = initialize_tracker_dependencies(config);
113125

114-
tracker_factory(config, &database, &whitelist_manager, &stats_event_sender, &stats_repository)
126+
tracker_factory(config, &database, &whitelist_manager)
115127
}
116128

117129
#[allow(clippy::type_complexity)]
118130
#[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-
) {
131+
pub fn initialize_tracker_dependencies(config: &Configuration) -> (Arc<Box<dyn Database>>, Arc<WhiteListManager>) {
127132
let database = initialize_database(config);
128133
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);
132134

133-
(database, whitelist_manager, stats_event_sender, stats_repository)
135+
(database, whitelist_manager)
134136
}
135137

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

src/bootstrap/jobs/http_tracker.rs

+4
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ mod tests {
8585

8686
use crate::bootstrap::app::initialize_with_configuration;
8787
use crate::bootstrap::jobs::http_tracker::start_job;
88+
use crate::core::services::statistics;
8889
use crate::servers::http::Version;
8990
use crate::servers::registar::Registar;
9091

@@ -93,6 +94,9 @@ mod tests {
9394
let cfg = Arc::new(ephemeral_public());
9495
let http_tracker = cfg.http_trackers.clone().expect("missing HTTP tracker configuration");
9596
let config = &http_tracker[0];
97+
let (stats_event_sender, stats_repository) = statistics::setup::factory(cfg.core.tracker_usage_statistics);
98+
let _stats_event_sender = Arc::new(stats_event_sender);
99+
let _stats_repository = Arc::new(stats_repository);
96100
let tracker = initialize_with_configuration(&cfg);
97101
let version = Version::V1;
98102

src/bootstrap/jobs/tracker_apis.rs

+57-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,52 @@ 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+
#[instrument(skip(
98+
socket,
99+
tls,
100+
tracker,
101+
ban_service,
102+
stats_event_sender,
103+
stats_repository,
104+
form,
105+
access_tokens
106+
))]
82107
async fn start_v1(
83108
socket: SocketAddr,
84109
tls: Option<RustlsConfig>,
85110
tracker: Arc<core::Tracker>,
86111
ban_service: Arc<RwLock<BanService>>,
112+
stats_event_sender: Arc<Option<Box<dyn Sender>>>,
113+
stats_repository: Arc<Repository>,
87114
form: ServiceRegistrationForm,
88115
access_tokens: Arc<AccessTokens>,
89116
) -> JoinHandle<()> {
90117
let server = ApiServer::new(Launcher::new(socket, tls))
91-
.start(tracker, ban_service, form, access_tokens)
118+
.start(
119+
tracker,
120+
ban_service,
121+
stats_event_sender,
122+
stats_repository,
123+
form,
124+
access_tokens,
125+
)
92126
.await
93127
.expect("it should be able to start to the tracker api");
94128

@@ -107,6 +141,7 @@ mod tests {
107141

108142
use crate::bootstrap::app::initialize_with_configuration;
109143
use crate::bootstrap::jobs::tracker_apis::start_job;
144+
use crate::core::services::statistics;
110145
use crate::servers::apis::Version;
111146
use crate::servers::registar::Registar;
112147
use crate::servers::udp::server::banning::BanService;
@@ -116,12 +151,26 @@ mod tests {
116151
async fn it_should_start_http_tracker() {
117152
let cfg = Arc::new(ephemeral_public());
118153
let config = &cfg.http_api.clone().unwrap();
119-
let tracker = initialize_with_configuration(&cfg);
154+
120155
let ban_service = Arc::new(RwLock::new(BanService::new(MAX_CONNECTION_ID_ERRORS_PER_IP)));
156+
let (stats_event_sender, stats_repository) = statistics::setup::factory(cfg.core.tracker_usage_statistics);
157+
let stats_event_sender = Arc::new(stats_event_sender);
158+
let stats_repository = Arc::new(stats_repository);
159+
160+
let tracker = initialize_with_configuration(&cfg);
161+
121162
let version = Version::V1;
122163

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");
164+
start_job(
165+
config,
166+
tracker,
167+
ban_service,
168+
stats_event_sender,
169+
stats_repository,
170+
Registar::default().give_form(),
171+
version,
172+
)
173+
.await
174+
.expect("it should be able to join to the tracker api start-job");
126175
}
127176
}

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));

src/core/mod.rs

+22-41
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@
422422
//! For example, the HTTP tracker would send an event like the following when it handles an `announce` request received from a peer using IP version 4.
423423
//!
424424
//! ```text
425-
//! tracker.send_stats_event(statistics::event::Event::Tcp4Announce).await
425+
//! stats_event_sender.send_stats_event(statistics::event::Event::Tcp4Announce).await
426426
//! ```
427427
//!
428428
//! Refer to [`statistics`] module for more information about statistics.
@@ -458,7 +458,6 @@ use std::time::Duration;
458458
use auth::PeerKey;
459459
use bittorrent_primitives::info_hash::InfoHash;
460460
use error::PeerKeyError;
461-
use tokio::sync::mpsc::error::SendError;
462461
use torrust_tracker_clock::clock::Time;
463462
use torrust_tracker_configuration::{AnnouncePolicy, Core, TORRENT_PEERS_LIMIT};
464463
use torrust_tracker_located_error::Located;
@@ -502,12 +501,6 @@ pub struct Tracker {
502501

503502
/// The in-memory torrents repository.
504503
torrents: Arc<Torrents>,
505-
506-
/// Service to send stats events.
507-
stats_event_sender: Arc<Option<Box<dyn statistics::event::sender::Sender>>>,
508-
509-
/// The in-memory stats repo.
510-
stats_repository: Arc<statistics::repository::Repository>,
511504
}
512505

513506
/// How many peers the peer announcing wants in the announce response.
@@ -576,17 +569,13 @@ impl Tracker {
576569
config: &Core,
577570
database: &Arc<Box<dyn Database>>,
578571
whitelist_manager: &Arc<WhiteListManager>,
579-
stats_event_sender: &Arc<Option<Box<dyn statistics::event::sender::Sender>>>,
580-
stats_repository: &Arc<statistics::repository::Repository>,
581572
) -> Result<Tracker, databases::error::Error> {
582573
Ok(Tracker {
583574
config: config.clone(),
584575
database: database.clone(),
585576
keys: tokio::sync::RwLock::new(std::collections::HashMap::new()),
586577
whitelist_manager: whitelist_manager.clone(),
587578
torrents: Arc::default(),
588-
stats_event_sender: stats_event_sender.clone(),
589-
stats_repository: stats_repository.clone(),
590579
})
591580
}
592581

@@ -1054,26 +1043,6 @@ impl Tracker {
10541043
})
10551044
}
10561045

1057-
/// It return the `Tracker` [`statistics::metrics::Metrics`].
1058-
///
1059-
/// # Context: Statistics
1060-
pub async fn get_stats(&self) -> tokio::sync::RwLockReadGuard<'_, statistics::metrics::Metrics> {
1061-
self.stats_repository.get_stats().await
1062-
}
1063-
1064-
/// It allows to send a statistic events which eventually will be used to update [`statistics::metrics::Metrics`].
1065-
///
1066-
/// # Context: Statistics
1067-
pub async fn send_stats_event(
1068-
&self,
1069-
event: statistics::event::Event,
1070-
) -> Option<Result<(), SendError<statistics::event::Event>>> {
1071-
match &*self.stats_event_sender {
1072-
None => None,
1073-
Some(stats_event_sender) => stats_event_sender.send_event(event).await,
1074-
}
1075-
}
1076-
10771046
/// It drops the database tables.
10781047
///
10791048
/// # Errors
@@ -1113,35 +1082,47 @@ mod tests {
11131082

11141083
use crate::bootstrap::app::initialize_tracker_dependencies;
11151084
use crate::core::peer::Peer;
1116-
use crate::core::services::tracker_factory;
1085+
use crate::core::services::{statistics, tracker_factory};
11171086
use crate::core::whitelist::WhiteListManager;
11181087
use crate::core::{TorrentsMetrics, Tracker};
11191088

11201089
fn public_tracker() -> Tracker {
11211090
let config = configuration::ephemeral_public();
1122-
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(&config);
1123-
tracker_factory(&config, &database, &whitelist_manager, &stats_event_sender, &stats_repository)
1091+
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
1092+
let (stats_event_sender, stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
1093+
let _stats_event_sender = Arc::new(stats_event_sender);
1094+
let _stats_repository = Arc::new(stats_repository);
1095+
tracker_factory(&config, &database, &whitelist_manager)
11241096
}
11251097

11261098
fn private_tracker() -> Tracker {
11271099
let config = configuration::ephemeral_private();
1128-
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(&config);
1129-
tracker_factory(&config, &database, &whitelist_manager, &stats_event_sender, &stats_repository)
1100+
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
1101+
let (stats_event_sender, stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
1102+
let _stats_event_sender = Arc::new(stats_event_sender);
1103+
let _stats_repository = Arc::new(stats_repository);
1104+
tracker_factory(&config, &database, &whitelist_manager)
11301105
}
11311106

11321107
fn whitelisted_tracker() -> (Tracker, Arc<WhiteListManager>) {
11331108
let config = configuration::ephemeral_listed();
1134-
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(&config);
1135-
let tracker = tracker_factory(&config, &database, &whitelist_manager, &stats_event_sender, &stats_repository);
1109+
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
1110+
let (stats_event_sender, stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
1111+
let _stats_event_sender = Arc::new(stats_event_sender);
1112+
let _stats_repository = Arc::new(stats_repository);
1113+
let tracker = tracker_factory(&config, &database, &whitelist_manager);
11361114

11371115
(tracker, whitelist_manager)
11381116
}
11391117

11401118
pub fn tracker_persisting_torrents_in_database() -> Tracker {
11411119
let mut config = configuration::ephemeral_listed();
11421120
config.core.tracker_policy.persistent_torrent_completed_stat = true;
1143-
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(&config);
1144-
tracker_factory(&config, &database, &whitelist_manager, &stats_event_sender, &stats_repository)
1121+
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
1122+
let (stats_event_sender, stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
1123+
let _stats_event_sender = Arc::new(stats_event_sender);
1124+
let _stats_repository = Arc::new(stats_repository);
1125+
tracker_factory(&config, &database, &whitelist_manager)
11451126
}
11461127

11471128
fn sample_info_hash() -> InfoHash {

0 commit comments

Comments
 (0)