Skip to content

Commit f71f0c4

Browse files
committed
Merge #1412: Refactor: AppContainer to initialize all services in the setup phase
299d0f3 refactor: [#1411] extract static methods in AppContainer (Jose Celano) ef5dc32 refactor: [#1411] reorganize fields in AppContainer (Jose Celano) 60ed2e4 refactor: [#1411] remove duplicate code for UdpTrackerServerServices initialization (Jose Celano) 4c7feb5 refactor: [#1411] remove duplicate code for UdpTrackerCoreServices initialization (Jose Celano) fdf2055 refactor: [#1411] remove duplicate code for HttpTrackerCoreServices initialization (Jose Celano) af80ada refactor: [#1411] store instance containers in app container (Jose Celano) Pull request description: Refactor `AppContainer` to initialize all services in the setup phase. I've also removed duplicate code for services initialization. The REST API container is still initialized in the "start" phase because requires more changes to handle the optional value. We don't need it at the root level for now. ACKs for top commit: josecelano: ACK 299d0f3 Tree-SHA512: 8e5e08725cdc3af0df76225962ff65a93eafab18cdb3d5339bcc4b4cd22791301f9a6c83172564e731c8df3c4334fbd6a9e3e0a4921ae037556f5c7f0009aaea
2 parents c744e38 + 299d0f3 commit f71f0c4

File tree

11 files changed

+268
-155
lines changed

11 files changed

+268
-155
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ regex = "1"
4646
reqwest = { version = "0", features = ["json"] }
4747
serde = { version = "1", features = ["derive"] }
4848
serde_json = { version = "1", features = ["preserve_order"] }
49+
thiserror = "2.0.12"
4950
tokio = { version = "1", features = ["macros", "net", "rt-multi-thread", "signal", "sync"] }
5051
torrust-axum-health-check-api-server = { version = "3.0.0-develop", path = "packages/axum-health-check-api-server" }
5152
torrust-axum-http-tracker-server = { version = "3.0.0-develop", path = "packages/axum-http-tracker-server" }

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ impl EnvContainer {
115115
let http_tracker_config = Arc::new(http_tracker_config[0].clone());
116116

117117
let tracker_core_container = Arc::new(TrackerCoreContainer::initialize(&core_config));
118-
let http_tracker_container = HttpTrackerCoreContainer::initialize_from(&tracker_core_container, &http_tracker_config);
118+
let http_tracker_container =
119+
HttpTrackerCoreContainer::initialize_from_tracker_core(&tracker_core_container, &http_tracker_config);
119120

120121
Self {
121122
tracker_core_container,

packages/axum-rest-tracker-api-server/src/environment.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,9 @@ impl EnvContainer {
174174

175175
let tracker_core_container = Arc::new(TrackerCoreContainer::initialize(&core_config));
176176
let http_tracker_core_container =
177-
HttpTrackerCoreContainer::initialize_from(&tracker_core_container, &http_tracker_config);
178-
let udp_tracker_core_container = UdpTrackerCoreContainer::initialize_from(&tracker_core_container, &udp_tracker_config);
177+
HttpTrackerCoreContainer::initialize_from_tracker_core(&tracker_core_container, &http_tracker_config);
178+
let udp_tracker_core_container =
179+
UdpTrackerCoreContainer::initialize_from_tracker_core(&tracker_core_container, &udp_tracker_config);
179180
let udp_tracker_server_container = UdpTrackerServerContainer::initialize(&core_config);
180181

181182
let tracker_http_api_core_container = TrackerHttpApiCoreContainer::initialize_from(

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

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,14 @@ use torrust_tracker_configuration::{Core, HttpTracker};
55

66
use crate::services::announce::AnnounceService;
77
use crate::services::scrape::ScrapeService;
8-
use crate::{event, statistics};
8+
use crate::{event, services, statistics};
99

1010
pub struct HttpTrackerCoreContainer {
11-
pub tracker_core_container: Arc<TrackerCoreContainer>,
1211
pub http_tracker_config: Arc<HttpTracker>,
12+
13+
pub tracker_core_container: Arc<TrackerCoreContainer>,
14+
15+
// `HttpTrackerCoreServices`
1316
pub http_stats_event_sender: Arc<Option<Box<dyn event::sender::Sender>>>,
1417
pub http_stats_repository: Arc<statistics::repository::Repository>,
1518
pub announce_service: Arc<AnnounceService>,
@@ -20,41 +23,68 @@ impl HttpTrackerCoreContainer {
2023
#[must_use]
2124
pub fn initialize(core_config: &Arc<Core>, http_tracker_config: &Arc<HttpTracker>) -> Arc<Self> {
2225
let tracker_core_container = Arc::new(TrackerCoreContainer::initialize(core_config));
23-
Self::initialize_from(&tracker_core_container, http_tracker_config)
26+
Self::initialize_from_tracker_core(&tracker_core_container, http_tracker_config)
2427
}
2528

2629
#[must_use]
27-
pub fn initialize_from(
30+
pub fn initialize_from_tracker_core(
2831
tracker_core_container: &Arc<TrackerCoreContainer>,
2932
http_tracker_config: &Arc<HttpTracker>,
3033
) -> Arc<Self> {
34+
let http_tracker_core_services = HttpTrackerCoreServices::initialize_from(tracker_core_container);
35+
Self::initialize_from_services(tracker_core_container, &http_tracker_core_services, http_tracker_config)
36+
}
37+
38+
#[must_use]
39+
pub fn initialize_from_services(
40+
tracker_core_container: &Arc<TrackerCoreContainer>,
41+
http_tracker_core_services: &Arc<HttpTrackerCoreServices>,
42+
http_tracker_config: &Arc<HttpTracker>,
43+
) -> Arc<Self> {
44+
Arc::new(Self {
45+
tracker_core_container: tracker_core_container.clone(),
46+
http_tracker_config: http_tracker_config.clone(),
47+
http_stats_event_sender: http_tracker_core_services.http_stats_event_sender.clone(),
48+
http_stats_repository: http_tracker_core_services.http_stats_repository.clone(),
49+
announce_service: http_tracker_core_services.http_announce_service.clone(),
50+
scrape_service: http_tracker_core_services.http_scrape_service.clone(),
51+
})
52+
}
53+
}
54+
55+
pub struct HttpTrackerCoreServices {
56+
pub http_stats_event_sender: Arc<Option<Box<dyn event::sender::Sender>>>,
57+
pub http_stats_repository: Arc<statistics::repository::Repository>,
58+
pub http_announce_service: Arc<services::announce::AnnounceService>,
59+
pub http_scrape_service: Arc<services::scrape::ScrapeService>,
60+
}
61+
62+
impl HttpTrackerCoreServices {
63+
#[must_use]
64+
pub fn initialize_from(tracker_core_container: &Arc<TrackerCoreContainer>) -> Arc<Self> {
3165
let (http_stats_event_sender, http_stats_repository) =
3266
statistics::setup::factory(tracker_core_container.core_config.tracker_usage_statistics);
3367
let http_stats_event_sender = Arc::new(http_stats_event_sender);
3468
let http_stats_repository = Arc::new(http_stats_repository);
35-
36-
let announce_service = Arc::new(AnnounceService::new(
69+
let http_announce_service = Arc::new(AnnounceService::new(
3770
tracker_core_container.core_config.clone(),
3871
tracker_core_container.announce_handler.clone(),
3972
tracker_core_container.authentication_service.clone(),
4073
tracker_core_container.whitelist_authorization.clone(),
4174
http_stats_event_sender.clone(),
4275
));
43-
44-
let scrape_service = Arc::new(ScrapeService::new(
76+
let http_scrape_service = Arc::new(ScrapeService::new(
4577
tracker_core_container.core_config.clone(),
4678
tracker_core_container.scrape_handler.clone(),
4779
tracker_core_container.authentication_service.clone(),
4880
http_stats_event_sender.clone(),
4981
));
5082

5183
Arc::new(Self {
52-
tracker_core_container: tracker_core_container.clone(),
53-
http_tracker_config: http_tracker_config.clone(),
54-
http_stats_event_sender: http_stats_event_sender.clone(),
55-
http_stats_repository: http_stats_repository.clone(),
56-
announce_service: announce_service.clone(),
57-
scrape_service: scrape_service.clone(),
84+
http_stats_event_sender,
85+
http_stats_repository,
86+
http_announce_service,
87+
http_scrape_service,
5888
})
5989
}
6090
}

packages/rest-tracker-api-core/src/container.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ use torrust_tracker_configuration::{Core, HttpApi, HttpTracker, UdpTracker};
1010
use torrust_udp_tracker_server::container::UdpTrackerServerContainer;
1111

1212
pub struct TrackerHttpApiCoreContainer {
13+
pub http_api_config: Arc<HttpApi>,
1314
pub tracker_core_container: Arc<TrackerCoreContainer>,
1415
pub http_stats_repository: Arc<bittorrent_http_tracker_core::statistics::repository::Repository>,
1516
pub ban_service: Arc<RwLock<BanService>>,
1617
pub udp_core_stats_repository: Arc<bittorrent_udp_tracker_core::statistics::repository::Repository>,
1718
pub udp_server_stats_repository: Arc<torrust_udp_tracker_server::statistics::repository::Repository>,
18-
pub http_api_config: Arc<HttpApi>,
1919
}
2020

2121
impl TrackerHttpApiCoreContainer {
@@ -27,8 +27,10 @@ impl TrackerHttpApiCoreContainer {
2727
http_api_config: &Arc<HttpApi>,
2828
) -> Arc<TrackerHttpApiCoreContainer> {
2929
let tracker_core_container = Arc::new(TrackerCoreContainer::initialize(core_config));
30-
let http_tracker_core_container = HttpTrackerCoreContainer::initialize_from(&tracker_core_container, http_tracker_config);
31-
let udp_tracker_core_container = UdpTrackerCoreContainer::initialize_from(&tracker_core_container, udp_tracker_config);
30+
let http_tracker_core_container =
31+
HttpTrackerCoreContainer::initialize_from_tracker_core(&tracker_core_container, http_tracker_config);
32+
let udp_tracker_core_container =
33+
UdpTrackerCoreContainer::initialize_from_tracker_core(&tracker_core_container, udp_tracker_config);
3234
let udp_tracker_server_container = UdpTrackerServerContainer::initialize(core_config);
3335

3436
Self::initialize_from(

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

Lines changed: 52 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@ use crate::services::announce::AnnounceService;
88
use crate::services::banning::BanService;
99
use crate::services::connect::ConnectService;
1010
use crate::services::scrape::ScrapeService;
11-
use crate::{event, statistics, MAX_CONNECTION_ID_ERRORS_PER_IP};
11+
use crate::{event, services, statistics, MAX_CONNECTION_ID_ERRORS_PER_IP};
1212

1313
pub struct UdpTrackerCoreContainer {
14-
pub tracker_core_container: Arc<TrackerCoreContainer>,
1514
pub udp_tracker_config: Arc<UdpTracker>,
15+
16+
pub tracker_core_container: Arc<TrackerCoreContainer>,
17+
18+
// `UdpTrackerCoreServices`
1619
pub udp_core_stats_event_sender: Arc<Option<Box<dyn event::sender::Sender>>>,
1720
pub udp_core_stats_repository: Arc<statistics::repository::Repository>,
1821
pub ban_service: Arc<RwLock<BanService>>,
@@ -25,14 +28,52 @@ impl UdpTrackerCoreContainer {
2528
#[must_use]
2629
pub fn initialize(core_config: &Arc<Core>, udp_tracker_config: &Arc<UdpTracker>) -> Arc<UdpTrackerCoreContainer> {
2730
let tracker_core_container = Arc::new(TrackerCoreContainer::initialize(core_config));
28-
Self::initialize_from(&tracker_core_container, udp_tracker_config)
31+
Self::initialize_from_tracker_core(&tracker_core_container, udp_tracker_config)
2932
}
3033

3134
#[must_use]
32-
pub fn initialize_from(
35+
pub fn initialize_from_tracker_core(
3336
tracker_core_container: &Arc<TrackerCoreContainer>,
3437
udp_tracker_config: &Arc<UdpTracker>,
3538
) -> Arc<UdpTrackerCoreContainer> {
39+
let udp_tracker_core_services = UdpTrackerCoreServices::initialize_from(tracker_core_container);
40+
Self::initialize_from_services(tracker_core_container, &udp_tracker_core_services, udp_tracker_config)
41+
}
42+
43+
#[must_use]
44+
pub fn initialize_from_services(
45+
tracker_core_container: &Arc<TrackerCoreContainer>,
46+
udp_tracker_core_services: &Arc<UdpTrackerCoreServices>,
47+
udp_tracker_config: &Arc<UdpTracker>,
48+
) -> Arc<Self> {
49+
Arc::new(Self {
50+
udp_tracker_config: udp_tracker_config.clone(),
51+
52+
tracker_core_container: tracker_core_container.clone(),
53+
54+
// `UdpTrackerCoreServices`
55+
udp_core_stats_event_sender: udp_tracker_core_services.udp_core_stats_event_sender.clone(),
56+
udp_core_stats_repository: udp_tracker_core_services.udp_core_stats_repository.clone(),
57+
ban_service: udp_tracker_core_services.udp_ban_service.clone(),
58+
connect_service: udp_tracker_core_services.udp_connect_service.clone(),
59+
announce_service: udp_tracker_core_services.udp_announce_service.clone(),
60+
scrape_service: udp_tracker_core_services.udp_scrape_service.clone(),
61+
})
62+
}
63+
}
64+
65+
pub struct UdpTrackerCoreServices {
66+
pub udp_core_stats_event_sender: Arc<Option<Box<dyn event::sender::Sender>>>,
67+
pub udp_core_stats_repository: Arc<statistics::repository::Repository>,
68+
pub udp_ban_service: Arc<RwLock<services::banning::BanService>>,
69+
pub udp_connect_service: Arc<services::connect::ConnectService>,
70+
pub udp_announce_service: Arc<services::announce::AnnounceService>,
71+
pub udp_scrape_service: Arc<services::scrape::ScrapeService>,
72+
}
73+
74+
impl UdpTrackerCoreServices {
75+
#[must_use]
76+
pub fn initialize_from(tracker_core_container: &Arc<TrackerCoreContainer>) -> Arc<Self> {
3677
let (udp_core_stats_event_sender, udp_core_stats_repository) =
3778
statistics::setup::factory(tracker_core_container.core_config.tracker_usage_statistics);
3879
let udp_core_stats_event_sender = Arc::new(udp_core_stats_event_sender);
@@ -49,15 +90,13 @@ impl UdpTrackerCoreContainer {
4990
udp_core_stats_event_sender.clone(),
5091
));
5192

52-
Arc::new(UdpTrackerCoreContainer {
53-
tracker_core_container: tracker_core_container.clone(),
54-
udp_tracker_config: udp_tracker_config.clone(),
55-
udp_core_stats_event_sender: udp_core_stats_event_sender.clone(),
56-
udp_core_stats_repository: udp_core_stats_repository.clone(),
57-
ban_service: ban_service.clone(),
58-
connect_service: connect_service.clone(),
59-
announce_service: announce_service.clone(),
60-
scrape_service: scrape_service.clone(),
93+
Arc::new(Self {
94+
udp_core_stats_event_sender,
95+
udp_core_stats_repository,
96+
udp_ban_service: ban_service,
97+
udp_connect_service: connect_service,
98+
udp_announce_service: announce_service,
99+
udp_scrape_service: scrape_service,
61100
})
62101
}
63102
}

packages/udp-tracker-server/src/container.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,23 @@ pub struct UdpTrackerServerContainer {
1010
}
1111

1212
impl UdpTrackerServerContainer {
13+
#[must_use]
14+
pub fn initialize(core_config: &Arc<Core>) -> Arc<Self> {
15+
let udp_tracker_server_services = UdpTrackerServerServices::initialize(core_config);
16+
17+
Arc::new(Self {
18+
udp_server_stats_event_sender: udp_tracker_server_services.udp_server_stats_event_sender.clone(),
19+
udp_server_stats_repository: udp_tracker_server_services.udp_server_stats_repository.clone(),
20+
})
21+
}
22+
}
23+
24+
pub struct UdpTrackerServerServices {
25+
pub udp_server_stats_event_sender: Arc<Option<Box<dyn event::sender::Sender>>>,
26+
pub udp_server_stats_repository: Arc<statistics::repository::Repository>,
27+
}
28+
29+
impl UdpTrackerServerServices {
1330
#[must_use]
1431
pub fn initialize(core_config: &Arc<Core>) -> Arc<Self> {
1532
let (udp_server_stats_event_sender, udp_server_stats_repository) =

packages/udp-tracker-server/src/environment.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@ impl EnvContainer {
131131
let udp_tracker_config = Arc::new(udp_tracker_configurations[0].clone());
132132

133133
let tracker_core_container = Arc::new(TrackerCoreContainer::initialize(&core_config));
134-
let udp_tracker_core_container = UdpTrackerCoreContainer::initialize_from(&tracker_core_container, &udp_tracker_config);
134+
let udp_tracker_core_container =
135+
UdpTrackerCoreContainer::initialize_from_tracker_core(&tracker_core_container, &udp_tracker_config);
135136
let udp_tracker_server_container = UdpTrackerServerContainer::initialize(&core_config);
136137

137138
Self {

src/app.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,10 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
9090
udp_tracker_config.bind_address
9191
);
9292
} else {
93-
let udp_tracker_config = Arc::new(udp_tracker_config.clone());
94-
let udp_tracker_container = Arc::new(app_container.udp_tracker_container(&udp_tracker_config));
95-
let udp_tracker_server_container = Arc::new(app_container.udp_tracker_server_container());
93+
let udp_tracker_container = app_container
94+
.udp_tracker_container(udp_tracker_config.bind_address)
95+
.expect("Could not create UDP tracker container");
96+
let udp_tracker_server_container = app_container.udp_tracker_server_container();
9697

9798
jobs.push(
9899
udp_tracker::start_job(udp_tracker_container, udp_tracker_server_container, registar.give_form()).await,
@@ -106,8 +107,9 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
106107
// Start the HTTP blocks
107108
if let Some(http_trackers) = &config.http_trackers {
108109
for http_tracker_config in http_trackers {
109-
let http_tracker_config = Arc::new(http_tracker_config.clone());
110-
let http_tracker_container = Arc::new(app_container.http_tracker_container(&http_tracker_config));
110+
let http_tracker_container = app_container
111+
.http_tracker_container(http_tracker_config.bind_address)
112+
.expect("Could not create HTTP tracker container");
111113

112114
if let Some(job) = http_tracker::start_job(
113115
http_tracker_container,
@@ -126,7 +128,7 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
126128
// Start HTTP API
127129
if let Some(http_api_config) = &config.http_api {
128130
let http_api_config = Arc::new(http_api_config.clone());
129-
let http_api_container = Arc::new(app_container.tracker_http_api_container(&http_api_config));
131+
let http_api_container = app_container.tracker_http_api_container(&http_api_config);
130132

131133
if let Some(job) = tracker_apis::start_job(
132134
http_api_container,
@@ -149,8 +151,6 @@ pub async fn start(config: &Configuration, app_container: &Arc<AppContainer>) ->
149151
));
150152
}
151153

152-
println!("Registar entries: {:?}", registar.entries());
153-
154154
// Start Health Check API
155155
jobs.push(health_check_api::start_job(&config.health_check_api, registar.entries()).await);
156156

0 commit comments

Comments
 (0)