Skip to content

Commit 07d1314

Browse files
committed
refactor: [#1444] http core event listener start in app start. Step 2
1 parent 17fb909 commit 07d1314

11 files changed

Lines changed: 115 additions & 55 deletions

File tree

packages/axum-http-tracker-server/src/server.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -270,10 +270,16 @@ mod tests {
270270

271271
let http_tracker_config = Arc::new(http_tracker_config.clone());
272272

273-
// HTTP stats
274-
let (http_stats_event_sender, http_stats_repository) =
275-
bittorrent_http_tracker_core::statistics::setup::factory(configuration.core.tracker_usage_statistics);
276-
let http_stats_event_sender = Arc::new(http_stats_event_sender);
273+
// HTTP core stats
274+
let keeper = bittorrent_http_tracker_core::statistics::setup::factory(configuration.core.tracker_usage_statistics);
275+
let http_stats_event_sender = keeper.sender();
276+
let http_stats_repository = keeper.repository();
277+
278+
if configuration.core.tracker_usage_statistics {
279+
// todo: this should be started like the other jobs during `app::start`
280+
// and keep the join handle in a list of jobs.
281+
let _unused = keeper.run_event_listener();
282+
}
277283

278284
let tracker_core_container = Arc::new(TrackerCoreContainer::initialize(&core_config));
279285

packages/axum-http-tracker-server/src/v1/handlers/announce.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,11 +160,16 @@ mod tests {
160160
&db_torrent_repository,
161161
));
162162

163-
// HTTP stats
164-
let (http_stats_event_sender, http_stats_repository) =
165-
bittorrent_http_tracker_core::statistics::setup::factory(config.core.tracker_usage_statistics);
166-
let http_stats_event_sender = Arc::new(http_stats_event_sender);
167-
let _http_stats_repository = Arc::new(http_stats_repository);
163+
// HTTP core stats
164+
let keeper = bittorrent_http_tracker_core::statistics::setup::factory(config.core.tracker_usage_statistics);
165+
let http_stats_event_sender = keeper.sender();
166+
let _http_stats_repository = keeper.repository();
167+
168+
if config.core.tracker_usage_statistics {
169+
// todo: this should be started like the other jobs during `app::start`
170+
// and keep the join handle in a list of jobs.
171+
let _unused = keeper.run_event_listener();
172+
}
168173

169174
let announce_service = Arc::new(AnnounceService::new(
170175
core_config.clone(),

packages/axum-http-tracker-server/src/v1/handlers/scrape.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,16 @@ mod tests {
131131
let in_memory_torrent_repository = Arc::new(InMemoryTorrentRepository::default());
132132
let scrape_handler = Arc::new(ScrapeHandler::new(&whitelist_authorization, &in_memory_torrent_repository));
133133

134-
// HTTP stats
135-
let (http_stats_event_sender, _http_stats_repository) =
136-
bittorrent_http_tracker_core::statistics::setup::factory(config.core.tracker_usage_statistics);
137-
let http_stats_event_sender = Arc::new(http_stats_event_sender);
134+
// HTTP core stats
135+
let keeper = bittorrent_http_tracker_core::statistics::setup::factory(config.core.tracker_usage_statistics);
136+
let http_stats_event_sender = keeper.sender();
137+
let _http_stats_repository = keeper.repository();
138+
139+
if config.core.tracker_usage_statistics {
140+
// todo: this should be started like the other jobs during `app::start`
141+
// and keep the join handle in a list of jobs.
142+
let _unused = keeper.run_event_listener();
143+
}
138144

139145
(
140146
CoreTrackerServices {

packages/http-tracker-core/benches/helpers/util.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ use std::net::{IpAddr, Ipv4Addr, SocketAddr};
22
use std::sync::Arc;
33

44
use aquatic_udp_protocol::{AnnounceEvent, NumberOfBytes, PeerId};
5+
use bittorrent_http_tracker_core::event::Event;
6+
use bittorrent_http_tracker_core::{event, statistics};
57
use bittorrent_http_tracker_protocol::v1::requests::announce::Announce;
68
use bittorrent_http_tracker_protocol::v1::services::peer_ip_resolver::ClientIpSources;
79
use bittorrent_primitives::info_hash::InfoHash;
@@ -13,6 +15,9 @@ use bittorrent_tracker_core::torrent::repository::in_memory::InMemoryTorrentRepo
1315
use bittorrent_tracker_core::torrent::repository::persisted::DatabasePersistentTorrentRepository;
1416
use bittorrent_tracker_core::whitelist::authorization::WhitelistAuthorization;
1517
use bittorrent_tracker_core::whitelist::repository::in_memory::InMemoryWhitelist;
18+
use futures::future::BoxFuture;
19+
use mockall::mock;
20+
use tokio::sync::broadcast::error::SendError;
1621
use torrust_tracker_configuration::{Configuration, Core};
1722
use torrust_tracker_primitives::peer::Peer;
1823
use torrust_tracker_primitives::{peer, DurationSinceUnixEpoch};
@@ -50,10 +55,16 @@ pub fn initialize_core_tracker_services_with_config(config: &Configuration) -> (
5055
&db_torrent_repository,
5156
));
5257

53-
// HTTP stats
54-
let (http_stats_event_sender, http_stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
55-
let http_stats_event_sender = Arc::new(http_stats_event_sender);
56-
let _http_stats_repository = Arc::new(http_stats_repository);
58+
// HTTP core stats
59+
let keeper = statistics::setup::factory(config.core.tracker_usage_statistics);
60+
let http_stats_event_sender = keeper.sender();
61+
let _http_stats_repository = keeper.repository();
62+
63+
if config.core.tracker_usage_statistics {
64+
// todo: this should be started like the other jobs during `app::start`
65+
// and keep the join handle in a list of jobs.
66+
let _unused = keeper.run_event_listener();
67+
}
5768

5869
(
5970
CoreTrackerServices {
@@ -105,12 +116,6 @@ pub fn sample_info_hash() -> InfoHash {
105116
.expect("String should be a valid info hash")
106117
}
107118

108-
use bittorrent_http_tracker_core::event::Event;
109-
use bittorrent_http_tracker_core::{event, statistics};
110-
use futures::future::BoxFuture;
111-
use mockall::mock;
112-
use tokio::sync::broadcast::error::SendError;
113-
114119
mock! {
115120
HttpStatsEventSender {}
116121
impl event::sender::Sender for HttpStatsEventSender {

packages/http-tracker-core/src/container.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,25 @@ pub struct HttpTrackerCoreServices {
6262
impl HttpTrackerCoreServices {
6363
#[must_use]
6464
pub fn initialize_from(tracker_core_container: &Arc<TrackerCoreContainer>) -> Arc<Self> {
65-
let (http_stats_event_sender, http_stats_repository) =
66-
statistics::setup::factory(tracker_core_container.core_config.tracker_usage_statistics);
67-
let http_stats_event_sender = Arc::new(http_stats_event_sender);
65+
// HTTP core stats
66+
let keeper = statistics::setup::factory(tracker_core_container.core_config.tracker_usage_statistics);
67+
let http_stats_event_sender = keeper.sender();
68+
let http_stats_repository = keeper.repository();
69+
70+
if tracker_core_container.core_config.tracker_usage_statistics {
71+
// todo: this should be started like the other jobs during `app::start`
72+
// and keep the join handle in a list of jobs.
73+
let _unused = keeper.run_event_listener();
74+
}
75+
6876
let http_announce_service = Arc::new(AnnounceService::new(
6977
tracker_core_container.core_config.clone(),
7078
tracker_core_container.announce_handler.clone(),
7179
tracker_core_container.authentication_service.clone(),
7280
tracker_core_container.whitelist_authorization.clone(),
7381
http_stats_event_sender.clone(),
7482
));
83+
7584
let http_scrape_service = Arc::new(ScrapeService::new(
7685
tracker_core_container.core_config.clone(),
7786
tracker_core_container.scrape_handler.clone(),

packages/http-tracker-core/src/services/announce.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -252,10 +252,16 @@ mod tests {
252252
&db_torrent_repository,
253253
));
254254

255-
// HTTP stats
256-
let (http_stats_event_sender, http_stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
257-
let http_stats_event_sender = Arc::new(http_stats_event_sender);
258-
let _http_stats_repository = Arc::new(http_stats_repository);
255+
// HTTP core stats
256+
let keeper = statistics::setup::factory(config.core.tracker_usage_statistics);
257+
let http_stats_event_sender = keeper.sender();
258+
let _http_stats_repository = keeper.repository();
259+
260+
if config.core.tracker_usage_statistics {
261+
// todo: this should be started like the other jobs during `app::start`
262+
// and keep the join handle in a list of jobs.
263+
let _unused = keeper.run_event_listener();
264+
}
259265

260266
(
261267
CoreTrackerServices {

packages/http-tracker-core/src/services/scrape.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -272,8 +272,10 @@ mod tests {
272272
let configuration = configuration::ephemeral_public();
273273
let core_config = Arc::new(configuration.core.clone());
274274

275-
let (http_stats_event_sender, _http_stats_repository) = statistics::setup::factory(false);
276-
let http_stats_event_sender = Arc::new(http_stats_event_sender);
275+
// HTTP core stats
276+
let keeper = statistics::setup::factory(false);
277+
let http_stats_event_sender = keeper.sender();
278+
let _http_stats_repository = keeper.repository();
277279

278280
let container = initialize_services_with_configuration(&configuration);
279281

@@ -462,8 +464,10 @@ mod tests {
462464

463465
let container = initialize_services_with_configuration(&config);
464466

465-
let (http_stats_event_sender, _http_stats_repository) = statistics::setup::factory(false);
466-
let http_stats_event_sender = Arc::new(http_stats_event_sender);
467+
// HTTP core stats
468+
let keeper = statistics::setup::factory(false);
469+
let http_stats_event_sender = keeper.sender();
470+
let _http_stats_repository = keeper.repository();
467471

468472
let info_hash = sample_info_hash();
469473
let info_hashes = vec![info_hash];

packages/http-tracker-core/src/statistics/keeper.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,11 @@ impl Keeper {
3939
}
4040

4141
#[must_use]
42-
pub fn sender(&self) -> Option<Box<dyn sender::Sender>> {
42+
pub fn sender(&self) -> Arc<Option<Box<dyn sender::Sender>>> {
4343
if self.enable_sender {
44-
Some(Box::new(self.broadcaster.clone()))
44+
Arc::new(Some(Box::new(self.broadcaster.clone())))
4545
} else {
46-
None
46+
Arc::new(None)
4747
}
4848
}
4949

packages/http-tracker-core/src/statistics/services.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,16 @@ mod tests {
8888

8989
let in_memory_torrent_repository = Arc::new(InMemoryTorrentRepository::default());
9090

91-
let (_http_stats_event_sender, http_stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
91+
// HTTP core stats
92+
let keeper = statistics::setup::factory(config.core.tracker_usage_statistics);
93+
let _http_stats_event_sender = keeper.sender();
94+
let http_stats_repository = keeper.repository();
95+
96+
if config.core.tracker_usage_statistics {
97+
// todo: this should be started like the other jobs during `app::start`
98+
// and keep the join handle in a list of jobs.
99+
let _unused = keeper.run_event_listener();
100+
}
92101

93102
let tracker_metrics = get_metrics(in_memory_torrent_repository.clone(), http_stats_repository).await;
94103

packages/http-tracker-core/src/statistics/setup.rs

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use std::sync::Arc;
55

66
use super::keeper::Keeper;
77
use super::repository::Repository;
8-
use crate::event;
98
use crate::event::sender::Broadcaster;
109

1110
/// It builds the structs needed for handling the tracker metrics.
@@ -21,16 +20,8 @@ use crate::event::sender::Broadcaster;
2120
/// not run the event listeners, consequently the statistics events are sent are
2221
/// received but not dispatched to the handler.
2322
#[must_use]
24-
pub fn factory(tracker_usage_statistics: bool) -> (Option<Box<dyn event::sender::Sender>>, Arc<Repository>) {
25-
let keeper = keeper_factory(tracker_usage_statistics);
26-
27-
if tracker_usage_statistics {
28-
// todo: this should be started like the other jobs during `app::start`
29-
// and keep the join handle in a list of jobs.
30-
let _unused = keeper.run_event_listener();
31-
}
32-
33-
(keeper.sender(), keeper.repository())
23+
pub fn factory(tracker_usage_statistics: bool) -> Arc<Keeper> {
24+
keeper_factory(tracker_usage_statistics)
3425
}
3526

3627
#[must_use]
@@ -48,17 +39,29 @@ mod test {
4839
async fn should_not_send_any_event_when_statistics_are_disabled() {
4940
let tracker_usage_statistics = false;
5041

51-
let (stats_event_sender, _stats_repository) = factory(tracker_usage_statistics);
42+
// HTTP core stats
43+
let keeper = factory(tracker_usage_statistics);
44+
let http_stats_event_sender = keeper.sender();
45+
let _http_stats_repository = keeper.repository();
46+
47+
if tracker_usage_statistics {
48+
// todo: this should be started like the other jobs during `app::start`
49+
// and keep the join handle in a list of jobs.
50+
let _unused = keeper.run_event_listener();
51+
}
5252

53-
assert!(stats_event_sender.is_none());
53+
assert!(http_stats_event_sender.is_none());
5454
}
5555

5656
#[tokio::test]
5757
async fn should_send_events_when_statistics_are_enabled() {
5858
let tracker_usage_statistics = true;
5959

60-
let (stats_event_sender, _stats_repository) = factory(tracker_usage_statistics);
60+
// HTTP core stats
61+
let keeper = factory(tracker_usage_statistics);
62+
let http_stats_event_sender = keeper.sender();
63+
let _http_stats_repository = keeper.repository();
6164

62-
assert!(stats_event_sender.is_some());
65+
assert!(http_stats_event_sender.is_some());
6366
}
6467
}

0 commit comments

Comments
 (0)