Skip to content

Commit c415430

Browse files
committed
refactor: [torrust#1184] inject stats event sender and repository into the core tracker
This is part of a big refactor. We are extracting responsabilities from the tracker. The first step is to inject the service into the tracker and later we will use the extracted services directly. Finally we will removed the injected service from the tracker when it's not used anymore via the tracker.
1 parent df924a0 commit c415430

File tree

10 files changed

+151
-71
lines changed

10 files changed

+151
-71
lines changed

src/bootstrap/app.rs

+18-5
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ use tracing::instrument;
2222
use super::config::initialize_configuration;
2323
use crate::bootstrap;
2424
use crate::core::databases::Database;
25-
use crate::core::services::{initialize_database, initialize_whitelist, tracker_factory};
25+
use crate::core::services::{initialize_database, initialize_whitelist, statistics, tracker_factory};
26+
use crate::core::statistics::event::sender::Sender;
27+
use crate::core::statistics::repository::Repository;
2628
use crate::core::whitelist::WhiteListManager;
2729
use crate::core::Tracker;
2830
use crate::servers::udp::server::banning::BanService;
@@ -107,17 +109,28 @@ pub fn initialize_static() {
107109
#[must_use]
108110
#[instrument(skip(config))]
109111
pub fn initialize_tracker(config: &Configuration) -> Tracker {
110-
let (database, whitelist_manager) = initialize_tracker_dependencies(config);
112+
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(config);
111113

112-
tracker_factory(config, &database, &whitelist_manager)
114+
tracker_factory(config, &database, &whitelist_manager, &stats_event_sender, &stats_repository)
113115
}
114116

117+
#[allow(clippy::type_complexity)]
115118
#[must_use]
116-
pub fn initialize_tracker_dependencies(config: &Configuration) -> (Arc<Box<dyn Database>>, Arc<WhiteListManager>) {
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+
) {
117127
let database = initialize_database(config);
118128
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);
119132

120-
(database, whitelist_manager)
133+
(database, whitelist_manager, stats_event_sender, stats_repository)
121134
}
122135

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

src/core/mod.rs

+15-15
Original file line numberDiff line numberDiff line change
@@ -504,10 +504,10 @@ pub struct Tracker {
504504
torrents: Arc<Torrents>,
505505

506506
/// Service to send stats events.
507-
stats_event_sender: Option<Box<dyn statistics::event::sender::Sender>>,
507+
stats_event_sender: Arc<Option<Box<dyn statistics::event::sender::Sender>>>,
508508

509509
/// The in-memory stats repo.
510-
stats_repository: statistics::repository::Repository,
510+
stats_repository: Arc<statistics::repository::Repository>,
511511
}
512512

513513
/// How many peers the peer announcing wants in the announce response.
@@ -576,17 +576,17 @@ impl Tracker {
576576
config: &Core,
577577
database: &Arc<Box<dyn Database>>,
578578
whitelist_manager: &Arc<WhiteListManager>,
579-
stats_event_sender: Option<Box<dyn statistics::event::sender::Sender>>,
580-
stats_repository: statistics::repository::Repository,
579+
stats_event_sender: &Arc<Option<Box<dyn statistics::event::sender::Sender>>>,
580+
stats_repository: &Arc<statistics::repository::Repository>,
581581
) -> Result<Tracker, databases::error::Error> {
582582
Ok(Tracker {
583583
config: config.clone(),
584584
database: database.clone(),
585585
keys: tokio::sync::RwLock::new(std::collections::HashMap::new()),
586586
whitelist_manager: whitelist_manager.clone(),
587587
torrents: Arc::default(),
588-
stats_event_sender,
589-
stats_repository,
588+
stats_event_sender: stats_event_sender.clone(),
589+
stats_repository: stats_repository.clone(),
590590
})
591591
}
592592

@@ -1068,7 +1068,7 @@ impl Tracker {
10681068
&self,
10691069
event: statistics::event::Event,
10701070
) -> Option<Result<(), SendError<statistics::event::Event>>> {
1071-
match &self.stats_event_sender {
1071+
match &*self.stats_event_sender {
10721072
None => None,
10731073
Some(stats_event_sender) => stats_event_sender.send_event(event).await,
10741074
}
@@ -1119,29 +1119,29 @@ mod tests {
11191119

11201120
fn public_tracker() -> Tracker {
11211121
let config = configuration::ephemeral_public();
1122-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
1123-
tracker_factory(&config, &database, &whitelist_manager)
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)
11241124
}
11251125

11261126
fn private_tracker() -> Tracker {
11271127
let config = configuration::ephemeral_private();
1128-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
1129-
tracker_factory(&config, &database, &whitelist_manager)
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)
11301130
}
11311131

11321132
fn whitelisted_tracker() -> (Tracker, Arc<WhiteListManager>) {
11331133
let config = configuration::ephemeral_listed();
1134-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
1135-
let tracker = tracker_factory(&config, &database, &whitelist_manager);
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);
11361136

11371137
(tracker, whitelist_manager)
11381138
}
11391139

11401140
pub fn tracker_persisting_torrents_in_database() -> Tracker {
11411141
let mut config = configuration::ephemeral_listed();
11421142
config.core.tracker_policy.persistent_torrent_completed_stat = true;
1143-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
1144-
tracker_factory(&config, &database, &whitelist_manager)
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)
11451145
}
11461146

11471147
fn sample_info_hash() -> InfoHash {

src/core/services/mod.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ use torrust_tracker_configuration::v2_0_0::database;
1414
use torrust_tracker_configuration::Configuration;
1515

1616
use super::databases::{self, Database};
17+
use super::statistics::event::sender::Sender;
18+
use super::statistics::repository::Repository;
1719
use super::whitelist::persisted::DatabaseWhitelist;
1820
use super::whitelist::WhiteListManager;
1921
use crate::core::Tracker;
@@ -28,8 +30,10 @@ pub fn tracker_factory(
2830
config: &Configuration,
2931
database: &Arc<Box<dyn Database>>,
3032
whitelist_manager: &Arc<WhiteListManager>,
33+
stats_event_sender: &Arc<Option<Box<dyn Sender>>>,
34+
stats_repository: &Arc<Repository>,
3135
) -> Tracker {
32-
let (stats_event_sender, stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
36+
//let (stats_event_sender, stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
3337

3438
match Tracker::new(
3539
&Arc::new(config).core,

src/core/services/statistics/mod.rs

+10-2
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,16 @@ mod tests {
126126
#[tokio::test]
127127
async fn the_statistics_service_should_return_the_tracker_metrics() {
128128
let config = tracker_configuration();
129-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
130-
let tracker = Arc::new(tracker_factory(&tracker_configuration(), &database, &whitelist_manager));
129+
130+
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(&config);
131+
let tracker = Arc::new(tracker_factory(
132+
&config,
133+
&database,
134+
&whitelist_manager,
135+
&stats_event_sender,
136+
&stats_repository,
137+
));
138+
131139
let ban_service = Arc::new(RwLock::new(BanService::new(MAX_CONNECTION_ID_ERRORS_PER_IP)));
132140

133141
let tracker_metrics = get_metrics(tracker.clone(), ban_service.clone()).await;

src/core/services/torrent.rs

+53-14
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,11 @@ mod tests {
141141
#[tokio::test]
142142
async fn should_return_none_if_the_tracker_does_not_have_the_torrent() {
143143
let config = tracker_configuration();
144-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
145-
let tracker = Arc::new(tracker_factory(&config, &database, &whitelist_manager));
144+
145+
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(&config);
146+
let tracker = tracker_factory(&config, &database, &whitelist_manager, &stats_event_sender, &stats_repository);
147+
148+
let tracker = Arc::new(tracker);
146149

147150
let torrent_info = get_torrent_info(
148151
tracker.clone(),
@@ -156,8 +159,14 @@ mod tests {
156159
#[tokio::test]
157160
async fn should_return_the_torrent_info_if_the_tracker_has_the_torrent() {
158161
let config = tracker_configuration();
159-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
160-
let tracker = Arc::new(tracker_factory(&config, &database, &whitelist_manager));
162+
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(&config);
163+
let tracker = Arc::new(tracker_factory(
164+
&config,
165+
&database,
166+
&whitelist_manager,
167+
&stats_event_sender,
168+
&stats_repository,
169+
));
161170

162171
let hash = "9e0217d0fa71c87332cd8bf9dbeabcb2c2cf3c4d".to_owned();
163172
let info_hash = InfoHash::from_str(&hash).unwrap();
@@ -199,8 +208,14 @@ mod tests {
199208
#[tokio::test]
200209
async fn should_return_an_empty_result_if_the_tracker_does_not_have_any_torrent() {
201210
let config = tracker_configuration();
202-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
203-
let tracker = Arc::new(tracker_factory(&config, &database, &whitelist_manager));
211+
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(&config);
212+
let tracker = Arc::new(tracker_factory(
213+
&config,
214+
&database,
215+
&whitelist_manager,
216+
&stats_event_sender,
217+
&stats_repository,
218+
));
204219

205220
let torrents = get_torrents_page(tracker.clone(), Some(&Pagination::default())).await;
206221

@@ -210,8 +225,14 @@ mod tests {
210225
#[tokio::test]
211226
async fn should_return_a_summarized_info_for_all_torrents() {
212227
let config = tracker_configuration();
213-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
214-
let tracker = Arc::new(tracker_factory(&config, &database, &whitelist_manager));
228+
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(&config);
229+
let tracker = Arc::new(tracker_factory(
230+
&config,
231+
&database,
232+
&whitelist_manager,
233+
&stats_event_sender,
234+
&stats_repository,
235+
));
215236

216237
let hash = "9e0217d0fa71c87332cd8bf9dbeabcb2c2cf3c4d".to_owned();
217238
let info_hash = InfoHash::from_str(&hash).unwrap();
@@ -234,8 +255,14 @@ mod tests {
234255
#[tokio::test]
235256
async fn should_allow_limiting_the_number_of_torrents_in_the_result() {
236257
let config = tracker_configuration();
237-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
238-
let tracker = Arc::new(tracker_factory(&config, &database, &whitelist_manager));
258+
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(&config);
259+
let tracker = Arc::new(tracker_factory(
260+
&config,
261+
&database,
262+
&whitelist_manager,
263+
&stats_event_sender,
264+
&stats_repository,
265+
));
239266

240267
let hash1 = "9e0217d0fa71c87332cd8bf9dbeabcb2c2cf3c4d".to_owned();
241268
let info_hash1 = InfoHash::from_str(&hash1).unwrap();
@@ -256,8 +283,14 @@ mod tests {
256283
#[tokio::test]
257284
async fn should_allow_using_pagination_in_the_result() {
258285
let config = tracker_configuration();
259-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
260-
let tracker = Arc::new(tracker_factory(&config, &database, &whitelist_manager));
286+
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(&config);
287+
let tracker = Arc::new(tracker_factory(
288+
&config,
289+
&database,
290+
&whitelist_manager,
291+
&stats_event_sender,
292+
&stats_repository,
293+
));
261294

262295
let hash1 = "9e0217d0fa71c87332cd8bf9dbeabcb2c2cf3c4d".to_owned();
263296
let info_hash1 = InfoHash::from_str(&hash1).unwrap();
@@ -287,8 +320,14 @@ mod tests {
287320
#[tokio::test]
288321
async fn should_return_torrents_ordered_by_info_hash() {
289322
let config = tracker_configuration();
290-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
291-
let tracker = Arc::new(tracker_factory(&config, &database, &whitelist_manager));
323+
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(&config);
324+
let tracker = Arc::new(tracker_factory(
325+
&config,
326+
&database,
327+
&whitelist_manager,
328+
&stats_event_sender,
329+
&stats_repository,
330+
));
292331

293332
let hash1 = "9e0217d0fa71c87332cd8bf9dbeabcb2c2cf3c4d".to_owned();
294333
let info_hash1 = InfoHash::from_str(&hash1).unwrap();

src/servers/http/v1/handlers/announce.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -191,26 +191,26 @@ mod tests {
191191

192192
fn private_tracker() -> Tracker {
193193
let config = configuration::ephemeral_private();
194-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
195-
tracker_factory(&config, &database, &whitelist_manager)
194+
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(&config);
195+
tracker_factory(&config, &database, &whitelist_manager, &stats_event_sender, &stats_repository)
196196
}
197197

198198
fn whitelisted_tracker() -> Tracker {
199199
let config = configuration::ephemeral_listed();
200-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
201-
tracker_factory(&config, &database, &whitelist_manager)
200+
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(&config);
201+
tracker_factory(&config, &database, &whitelist_manager, &stats_event_sender, &stats_repository)
202202
}
203203

204204
fn tracker_on_reverse_proxy() -> Tracker {
205205
let config = configuration::ephemeral_with_reverse_proxy();
206-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
207-
tracker_factory(&config, &database, &whitelist_manager)
206+
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(&config);
207+
tracker_factory(&config, &database, &whitelist_manager, &stats_event_sender, &stats_repository)
208208
}
209209

210210
fn tracker_not_on_reverse_proxy() -> Tracker {
211211
let config = configuration::ephemeral_without_reverse_proxy();
212-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
213-
tracker_factory(&config, &database, &whitelist_manager)
212+
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(&config);
213+
tracker_factory(&config, &database, &whitelist_manager, &stats_event_sender, &stats_repository)
214214
}
215215

216216
fn sample_announce_request() -> Announce {

src/servers/http/v1/handlers/scrape.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -127,26 +127,26 @@ mod tests {
127127

128128
fn private_tracker() -> Tracker {
129129
let config = configuration::ephemeral_private();
130-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
131-
tracker_factory(&config, &database, &whitelist_manager)
130+
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(&config);
131+
tracker_factory(&config, &database, &whitelist_manager, &stats_event_sender, &stats_repository)
132132
}
133133

134134
fn whitelisted_tracker() -> Tracker {
135135
let config = configuration::ephemeral_listed();
136-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
137-
tracker_factory(&config, &database, &whitelist_manager)
136+
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(&config);
137+
tracker_factory(&config, &database, &whitelist_manager, &stats_event_sender, &stats_repository)
138138
}
139139

140140
fn tracker_on_reverse_proxy() -> Tracker {
141141
let config = configuration::ephemeral_with_reverse_proxy();
142-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
143-
tracker_factory(&config, &database, &whitelist_manager)
142+
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(&config);
143+
tracker_factory(&config, &database, &whitelist_manager, &stats_event_sender, &stats_repository)
144144
}
145145

146146
fn tracker_not_on_reverse_proxy() -> Tracker {
147147
let config = configuration::ephemeral_without_reverse_proxy();
148-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
149-
tracker_factory(&config, &database, &whitelist_manager)
148+
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(&config);
149+
tracker_factory(&config, &database, &whitelist_manager, &stats_event_sender, &stats_repository)
150150
}
151151

152152
fn sample_scrape_request() -> Scrape {

src/servers/http/v1/services/announce.rs

+9-5
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ mod tests {
6565

6666
fn public_tracker() -> Tracker {
6767
let config = configuration::ephemeral_public();
68-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
69-
tracker_factory(&config, &database, &whitelist_manager)
68+
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(&config);
69+
tracker_factory(&config, &database, &whitelist_manager, &stats_event_sender, &stats_repository)
7070
}
7171

7272
fn sample_info_hash() -> InfoHash {
@@ -118,14 +118,18 @@ mod tests {
118118
fn test_tracker_factory(stats_event_sender: Option<Box<dyn statistics::event::sender::Sender>>) -> Tracker {
119119
let config = configuration::ephemeral();
120120

121-
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
121+
let (database, whitelist_manager, _stats_event_sender, _stats_repository) = initialize_tracker_dependencies(&config);
122+
123+
let stats_event_sender = Arc::new(stats_event_sender);
124+
125+
let stats_repository = Arc::new(statistics::repository::Repository::new());
122126

123127
Tracker::new(
124128
&config.core,
125129
&database,
126130
&whitelist_manager,
127-
stats_event_sender,
128-
statistics::repository::Repository::new(),
131+
&stats_event_sender,
132+
&stats_repository,
129133
)
130134
.unwrap()
131135
}

0 commit comments

Comments
 (0)