Skip to content

Commit af80ada

Browse files
committed
refactor: [#1411] store instance containers in app container
1 parent c744e38 commit af80ada

5 files changed

Lines changed: 113 additions & 38 deletions

File tree

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/rest-tracker-api-core/src/container.rs

Lines changed: 1 addition & 1 deletion
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 {

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

src/container.rs

Lines changed: 102 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::collections::HashMap;
2+
use std::net::SocketAddr;
13
use std::sync::Arc;
24

35
use bittorrent_http_tracker_core::container::HttpTrackerCoreContainer;
@@ -9,12 +11,22 @@ use bittorrent_udp_tracker_core::services::banning::BanService;
911
use bittorrent_udp_tracker_core::{self, MAX_CONNECTION_ID_ERRORS_PER_IP};
1012
use tokio::sync::RwLock;
1113
use torrust_rest_tracker_api_core::container::TrackerHttpApiCoreContainer;
12-
use torrust_tracker_configuration::{Configuration, HttpApi, HttpTracker, UdpTracker};
14+
use torrust_tracker_configuration::{Configuration, HttpApi};
1315
use torrust_udp_tracker_server::container::UdpTrackerServerContainer;
1416
use tracing::instrument;
1517

18+
#[derive(thiserror::Error, Debug, Clone)]
19+
pub enum Error {
20+
#[error("There is not a HTTP tracker server instance bound to the socket address: {bind_address}")]
21+
MissingHttpTrackerCoreContainer { bind_address: SocketAddr },
22+
23+
#[error("There is not a UDP tracker server instance bound to the socket address: {bind_address}")]
24+
MissingUdpTrackerCoreContainer { bind_address: SocketAddr },
25+
}
26+
1627
pub struct AppContainer {
1728
pub tracker_core_container: Arc<TrackerCoreContainer>,
29+
pub http_api_config: Arc<Option<HttpApi>>,
1830

1931
// UDP Tracker Core Services
2032
pub udp_core_stats_event_sender: Arc<Option<Box<dyn bittorrent_udp_tracker_core::event::sender::Sender>>>,
@@ -33,13 +45,22 @@ pub struct AppContainer {
3345
// UDP Tracker Server Services
3446
pub udp_server_stats_event_sender: Arc<Option<Box<dyn torrust_udp_tracker_server::event::sender::Sender>>>,
3547
pub udp_server_stats_repository: Arc<torrust_udp_tracker_server::statistics::repository::Repository>,
48+
49+
// UDP Tracker Server Container
50+
pub udp_tracker_server_container: Arc<UdpTrackerServerContainer>,
51+
52+
// Tracker Instance Containers
53+
pub http_tracker_containers: Arc<HashMap<SocketAddr, Arc<HttpTrackerCoreContainer>>>,
54+
pub udp_tracker_containers: Arc<HashMap<SocketAddr, Arc<UdpTrackerCoreContainer>>>,
3655
}
3756

3857
impl AppContainer {
3958
#[instrument(skip())]
4059
pub fn initialize(configuration: &Configuration) -> AppContainer {
4160
let core_config = Arc::new(configuration.core.clone());
4261

62+
let http_api_config = Arc::new(configuration.http_api.clone());
63+
4364
let tracker_core_container = Arc::new(TrackerCoreContainer::initialize(&core_config));
4465

4566
// HTTP Tracker Core Services
@@ -86,8 +107,59 @@ impl AppContainer {
86107
let udp_server_stats_event_sender = Arc::new(udp_server_stats_event_sender);
87108
let udp_server_stats_repository = Arc::new(udp_server_stats_repository);
88109

110+
// UDP Tracker Server Container
111+
let udp_tracker_server_container = Arc::new(UdpTrackerServerContainer {
112+
udp_server_stats_event_sender: udp_server_stats_event_sender.clone(),
113+
udp_server_stats_repository: udp_server_stats_repository.clone(),
114+
});
115+
116+
// Tracker Instance Containers
117+
118+
let mut http_tracker_containers = HashMap::new();
119+
120+
if let Some(http_trackers) = &configuration.http_trackers {
121+
for http_tracker_config in http_trackers {
122+
http_tracker_containers.insert(
123+
http_tracker_config.bind_address,
124+
Arc::new(HttpTrackerCoreContainer {
125+
tracker_core_container: tracker_core_container.clone(),
126+
http_tracker_config: Arc::new(http_tracker_config.clone()),
127+
http_stats_event_sender: http_stats_event_sender.clone(),
128+
http_stats_repository: http_stats_repository.clone(),
129+
announce_service: http_announce_service.clone(),
130+
scrape_service: http_scrape_service.clone(),
131+
}),
132+
);
133+
}
134+
}
135+
136+
let http_tracker_containers = Arc::new(http_tracker_containers);
137+
138+
let mut udp_tracker_containers = HashMap::new();
139+
140+
if let Some(udp_trackers) = &configuration.udp_trackers {
141+
for udp_tracker_config in udp_trackers {
142+
udp_tracker_containers.insert(
143+
udp_tracker_config.bind_address,
144+
Arc::new(UdpTrackerCoreContainer {
145+
tracker_core_container: tracker_core_container.clone(),
146+
udp_tracker_config: Arc::new(udp_tracker_config.clone()),
147+
udp_core_stats_event_sender: udp_core_stats_event_sender.clone(),
148+
udp_core_stats_repository: udp_core_stats_repository.clone(),
149+
ban_service: udp_ban_service.clone(),
150+
connect_service: udp_connect_service.clone(),
151+
announce_service: udp_announce_service.clone(),
152+
scrape_service: udp_scrape_service.clone(),
153+
}),
154+
);
155+
}
156+
}
157+
158+
let udp_tracker_containers = Arc::new(udp_tracker_containers);
159+
89160
AppContainer {
90161
tracker_core_container,
162+
http_api_config,
91163

92164
// UDP Tracker Core Services
93165
udp_core_stats_event_sender,
@@ -106,37 +178,45 @@ impl AppContainer {
106178
// UDP Tracker Server Services
107179
udp_server_stats_event_sender,
108180
udp_server_stats_repository,
181+
182+
// UDP Tracker Server Container
183+
udp_tracker_server_container,
184+
185+
// Tracker Instance Containers
186+
http_tracker_containers,
187+
udp_tracker_containers,
109188
}
110189
}
111190

112191
#[must_use]
113-
pub fn http_tracker_container(&self, http_tracker_config: &Arc<HttpTracker>) -> HttpTrackerCoreContainer {
114-
HttpTrackerCoreContainer {
115-
tracker_core_container: self.tracker_core_container.clone(),
116-
http_tracker_config: http_tracker_config.clone(),
117-
http_stats_event_sender: self.http_stats_event_sender.clone(),
118-
http_stats_repository: self.http_stats_repository.clone(),
119-
announce_service: self.http_announce_service.clone(),
120-
scrape_service: self.http_scrape_service.clone(),
192+
pub fn udp_tracker_server_container(&self) -> Arc<UdpTrackerServerContainer> {
193+
self.udp_tracker_server_container.clone()
194+
}
195+
196+
/// # Errors
197+
///
198+
/// Return an error if there is no HTTP tracker server instance bound to the
199+
/// socket address.
200+
pub fn http_tracker_container(&self, bind_address: SocketAddr) -> Result<Arc<HttpTrackerCoreContainer>, Error> {
201+
match self.http_tracker_containers.get(&bind_address) {
202+
Some(http_tracker_container) => Ok(http_tracker_container.clone()),
203+
None => Err(Error::MissingHttpTrackerCoreContainer { bind_address }),
121204
}
122205
}
123206

124-
#[must_use]
125-
pub fn udp_tracker_container(&self, udp_tracker_config: &Arc<UdpTracker>) -> UdpTrackerCoreContainer {
126-
UdpTrackerCoreContainer {
127-
tracker_core_container: self.tracker_core_container.clone(),
128-
udp_tracker_config: udp_tracker_config.clone(),
129-
udp_core_stats_event_sender: self.udp_core_stats_event_sender.clone(),
130-
udp_core_stats_repository: self.udp_core_stats_repository.clone(),
131-
ban_service: self.udp_ban_service.clone(),
132-
connect_service: self.udp_connect_service.clone(),
133-
announce_service: self.udp_announce_service.clone(),
134-
scrape_service: self.udp_scrape_service.clone(),
207+
/// # Errors
208+
///
209+
/// Return an error if there is no UDP tracker server instance bound to the
210+
/// socket address.
211+
pub fn udp_tracker_container(&self, bind_address: SocketAddr) -> Result<Arc<UdpTrackerCoreContainer>, Error> {
212+
match self.udp_tracker_containers.get(&bind_address) {
213+
Some(udp_tracker_container) => Ok(udp_tracker_container.clone()),
214+
None => Err(Error::MissingUdpTrackerCoreContainer { bind_address }),
135215
}
136216
}
137217

138218
#[must_use]
139-
pub fn tracker_http_api_container(&self, http_api_config: &Arc<HttpApi>) -> TrackerHttpApiCoreContainer {
219+
pub fn tracker_http_api_container(&self, http_api_config: &Arc<HttpApi>) -> Arc<TrackerHttpApiCoreContainer> {
140220
TrackerHttpApiCoreContainer {
141221
tracker_core_container: self.tracker_core_container.clone(),
142222
http_api_config: http_api_config.clone(),
@@ -145,13 +225,6 @@ impl AppContainer {
145225
udp_core_stats_repository: self.udp_core_stats_repository.clone(),
146226
udp_server_stats_repository: self.udp_server_stats_repository.clone(),
147227
}
148-
}
149-
150-
#[must_use]
151-
pub fn udp_tracker_server_container(&self) -> UdpTrackerServerContainer {
152-
UdpTrackerServerContainer {
153-
udp_server_stats_event_sender: self.udp_server_stats_event_sender.clone(),
154-
udp_server_stats_repository: self.udp_server_stats_repository.clone(),
155-
}
228+
.into()
156229
}
157230
}

0 commit comments

Comments
 (0)