Skip to content

Commit b784442

Browse files
committed
refactor: inject new struct StatsEventSender into TorrentTracker
Parallel change. We are still using the old TrackerStatsService to send events.
1 parent a334f17 commit b784442

File tree

5 files changed

+88
-27
lines changed

5 files changed

+88
-27
lines changed

src/main.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,16 @@ async fn main() {
2424
};
2525

2626
// Initialize stats tracker
27-
let stats_tracker = StatsTracker::new_instance(config.tracker_usage_statistics);
27+
let mut stats_tracker = StatsTracker::new_inactive_instance();
28+
29+
let mut stats_event_sender = None;
30+
31+
if config.tracker_usage_statistics {
32+
stats_event_sender = Some(stats_tracker.run_worker());
33+
}
2834

2935
// Initialize Torrust tracker
30-
let tracker = match TorrentTracker::new(config.clone(), Box::new(stats_tracker)) {
36+
let tracker = match TorrentTracker::new(config.clone(), Box::new(stats_tracker), stats_event_sender) {
3137
Ok(tracker) => Arc::new(tracker),
3238
Err(error) => {
3339
panic!("{}", error)

src/tracker/statistics.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ pub struct StatsTracker {
6262
}
6363

6464
impl StatsTracker {
65-
pub fn new_active_instance() -> (Self, StatsEventSender) {
65+
pub fn new_active_instance() -> (Self, Box<dyn TrackerStatisticsEventSender>) {
6666
let mut stats_tracker = Self {
6767
channel_sender: None,
6868
stats: Arc::new(RwLock::new(TrackerStatistics::new())),
@@ -97,7 +97,7 @@ impl StatsTracker {
9797
}
9898
}
9999

100-
pub fn run_worker(&mut self) -> StatsEventSender {
100+
pub fn run_worker(&mut self) -> Box<dyn TrackerStatisticsEventSender> {
101101
let (tx, mut rx) = mpsc::channel::<TrackerStatisticsEvent>(CHANNEL_BUFFER_SIZE);
102102

103103
// set send channel on stats_tracker
@@ -150,7 +150,7 @@ impl StatsTracker {
150150
}
151151
});
152152

153-
StatsEventSender { sender: tx }
153+
Box::new(StatsEventSender { sender: tx })
154154
}
155155
}
156156

src/tracker/tracker.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use crate::databases::database::Database;
1212
use crate::mode::TrackerMode;
1313
use crate::peer::TorrentPeer;
1414
use crate::protocol::common::InfoHash;
15-
use crate::statistics::{TrackerStatistics, TrackerStatisticsEvent, TrackerStatsService};
15+
use crate::statistics::{TrackerStatistics, TrackerStatisticsEvent, TrackerStatisticsEventSender, TrackerStatsService};
1616
use crate::tracker::key;
1717
use crate::tracker::key::AuthKey;
1818
use crate::tracker::torrent::{TorrentEntry, TorrentError, TorrentStats};
@@ -25,11 +25,16 @@ pub struct TorrentTracker {
2525
whitelist: RwLock<std::collections::HashSet<InfoHash>>,
2626
torrents: RwLock<std::collections::BTreeMap<InfoHash, TorrentEntry>>,
2727
stats_tracker: Box<dyn TrackerStatsService>,
28+
_stats_event_sender: Option<Box<dyn TrackerStatisticsEventSender>>,
2829
database: Box<dyn Database>,
2930
}
3031

3132
impl TorrentTracker {
32-
pub fn new(config: Arc<Configuration>, stats_tracker: Box<dyn TrackerStatsService>) -> Result<TorrentTracker, r2d2::Error> {
33+
pub fn new(
34+
config: Arc<Configuration>,
35+
stats_tracker: Box<dyn TrackerStatsService>,
36+
_stats_event_sender: Option<Box<dyn TrackerStatisticsEventSender>>,
37+
) -> Result<TorrentTracker, r2d2::Error> {
3338
let database = database::connect_database(&config.db_driver, &config.db_path)?;
3439

3540
Ok(TorrentTracker {
@@ -39,6 +44,7 @@ impl TorrentTracker {
3944
whitelist: RwLock::new(std::collections::HashSet::new()),
4045
torrents: RwLock::new(std::collections::BTreeMap::new()),
4146
stats_tracker,
47+
_stats_event_sender,
4248
database,
4349
})
4450
}

src/udp/handlers.rs

Lines changed: 66 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -285,9 +285,9 @@ mod tests {
285285
}
286286

287287
fn initialized_tracker(configuration: Arc<Configuration>) -> Arc<TorrentTracker> {
288-
let (stats_tracker, _stats_event_sender) = StatsTracker::new_active_instance();
289-
Arc::new(TorrentTracker::new(configuration, Box::new(stats_tracker)).unwrap())
290-
}
288+
let (stats_tracker, stats_event_sender) = StatsTracker::new_active_instance();
289+
Arc::new(TorrentTracker::new(configuration, Box::new(stats_tracker), Some(stats_event_sender)).unwrap())
290+
}
291291

292292
fn sample_ipv4_remote_addr() -> SocketAddr {
293293
sample_ipv4_socket_address()
@@ -371,6 +371,30 @@ mod tests {
371371
}
372372
}
373373

374+
struct StatsEventSenderMock {
375+
expected_event: Option<TrackerStatisticsEvent>,
376+
}
377+
378+
impl StatsEventSenderMock {
379+
fn new() -> Self {
380+
Self { expected_event: None }
381+
}
382+
383+
fn should_throw_event(&mut self, expected_event: TrackerStatisticsEvent) {
384+
self.expected_event = Some(expected_event);
385+
}
386+
}
387+
388+
#[async_trait]
389+
impl TrackerStatisticsEventSender for StatsEventSenderMock {
390+
async fn send_event(&self, _event: TrackerStatisticsEvent) -> Option<Result<(), SendError<TrackerStatisticsEvent>>> {
391+
if self.expected_event.is_some() {
392+
assert_eq!(_event, *self.expected_event.as_ref().unwrap());
393+
}
394+
None
395+
}
396+
}
397+
374398
#[async_trait]
375399
impl TrackerStatisticsRepository for TrackerStatsServiceMock {
376400
async fn get_stats(&self) -> RwLockReadGuard<'_, TrackerStatistics> {
@@ -413,7 +437,10 @@ mod tests {
413437

414438
use aquatic_udp_protocol::{ConnectRequest, ConnectResponse, Response, TransactionId};
415439

416-
use super::{default_tracker_config, sample_ipv4_socket_address, sample_ipv6_remote_addr, TrackerStatsServiceMock};
440+
use super::{
441+
default_tracker_config, sample_ipv4_socket_address, sample_ipv6_remote_addr, StatsEventSenderMock,
442+
TrackerStatsServiceMock,
443+
};
417444
use crate::statistics::TrackerStatisticsEvent;
418445
use crate::tracker::tracker::TorrentTracker;
419446
use crate::udp::connection_cookie::{into_connection_id, make_connection_cookie};
@@ -467,11 +494,13 @@ mod tests {
467494
#[tokio::test]
468495
async fn it_should_send_the_upd4_connect_event_when_a_client_tries_to_connect_using_a_ip4_socket_address() {
469496
let mut tracker_stats_service = Box::new(TrackerStatsServiceMock::new());
497+
let stats_event_sender = Box::new(StatsEventSenderMock::new());
470498

471499
let client_socket_address = sample_ipv4_socket_address();
472500
tracker_stats_service.should_throw_event(TrackerStatisticsEvent::Udp4Connect);
473501

474-
let torrent_tracker = Arc::new(TorrentTracker::new(default_tracker_config(), tracker_stats_service).unwrap());
502+
let torrent_tracker =
503+
Arc::new(TorrentTracker::new(default_tracker_config(), tracker_stats_service, Some(stats_event_sender)).unwrap());
475504
handle_connect(client_socket_address, &sample_connect_request(), torrent_tracker)
476505
.await
477506
.unwrap();
@@ -480,10 +509,12 @@ mod tests {
480509
#[tokio::test]
481510
async fn it_should_send_the_upd6_connect_event_when_a_client_tries_to_connect_using_a_ip6_socket_address() {
482511
let mut tracker_stats_service = Box::new(TrackerStatsServiceMock::new());
512+
let stats_event_sender = Box::new(StatsEventSenderMock::new());
483513

484514
tracker_stats_service.should_throw_event(TrackerStatisticsEvent::Udp6Connect);
485515

486-
let torrent_tracker = Arc::new(TorrentTracker::new(default_tracker_config(), tracker_stats_service).unwrap());
516+
let torrent_tracker =
517+
Arc::new(TorrentTracker::new(default_tracker_config(), tracker_stats_service, Some(stats_event_sender)).unwrap());
487518
handle_connect(sample_ipv6_remote_addr(), &sample_connect_request(), torrent_tracker)
488519
.await
489520
.unwrap();
@@ -577,8 +608,8 @@ mod tests {
577608
use crate::udp::handle_announce;
578609
use crate::udp::handlers::tests::announce_request::AnnounceRequestBuilder;
579610
use crate::udp::handlers::tests::{
580-
default_tracker_config, initialized_public_tracker, sample_ipv4_socket_address, TorrentPeerBuilder,
581-
TrackerStatsServiceMock,
611+
default_tracker_config, initialized_public_tracker, sample_ipv4_socket_address, StatsEventSenderMock,
612+
TorrentPeerBuilder, TrackerStatsServiceMock,
582613
};
583614
use crate::PeerId;
584615

@@ -718,10 +749,13 @@ mod tests {
718749
#[tokio::test]
719750
async fn should_send_the_upd4_announce_event() {
720751
let mut tracker_stats_service = Box::new(TrackerStatsServiceMock::new());
752+
let stats_event_sender = Box::new(StatsEventSenderMock::new());
721753

722754
tracker_stats_service.should_throw_event(TrackerStatisticsEvent::Udp4Announce);
723755

724-
let tracker = Arc::new(TorrentTracker::new(default_tracker_config(), tracker_stats_service).unwrap());
756+
let tracker = Arc::new(
757+
TorrentTracker::new(default_tracker_config(), tracker_stats_service, Some(stats_event_sender)).unwrap(),
758+
);
725759
handle_announce(
726760
sample_ipv4_socket_address(),
727761
&AnnounceRequestBuilder::default().into(),
@@ -794,8 +828,8 @@ mod tests {
794828
use crate::udp::handle_announce;
795829
use crate::udp::handlers::tests::announce_request::AnnounceRequestBuilder;
796830
use crate::udp::handlers::tests::{
797-
default_tracker_config, initialized_public_tracker, sample_ipv6_remote_addr, TorrentPeerBuilder,
798-
TrackerStatsServiceMock,
831+
default_tracker_config, initialized_public_tracker, sample_ipv6_remote_addr, StatsEventSenderMock,
832+
TorrentPeerBuilder, TrackerStatsServiceMock,
799833
};
800834
use crate::PeerId;
801835

@@ -942,10 +976,13 @@ mod tests {
942976
#[tokio::test]
943977
async fn should_send_the_upd6_announce_event() {
944978
let mut tracker_stats_service = Box::new(TrackerStatsServiceMock::new());
979+
let stats_event_sender = Box::new(StatsEventSenderMock::new());
945980

946981
tracker_stats_service.should_throw_event(TrackerStatisticsEvent::Udp6Announce);
947982

948-
let tracker = Arc::new(TorrentTracker::new(default_tracker_config(), tracker_stats_service).unwrap());
983+
let tracker = Arc::new(
984+
TorrentTracker::new(default_tracker_config(), tracker_stats_service, Some(stats_event_sender)).unwrap(),
985+
);
949986

950987
let remote_addr = sample_ipv6_remote_addr();
951988

@@ -974,8 +1011,9 @@ mod tests {
9741011
#[tokio::test]
9751012
async fn the_peer_ip_should_be_changed_to_the_external_ip_in_the_tracker_configuration() {
9761013
let configuration = Arc::new(TrackerConfigurationBuilder::default().with_external_ip("::126.0.0.1").into());
977-
let (stats_tracker, _stats_event_sender) = StatsTracker::new_active_instance();
978-
let tracker = Arc::new(TorrentTracker::new(configuration, Box::new(stats_tracker)).unwrap());
1014+
let (stats_tracker, stats_event_sender) = StatsTracker::new_active_instance();
1015+
let tracker =
1016+
Arc::new(TorrentTracker::new(configuration, Box::new(stats_tracker), Some(stats_event_sender)).unwrap());
9791017

9801018
let loopback_ipv4 = Ipv4Addr::new(127, 0, 0, 1);
9811019
let loopback_ipv6 = Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1);
@@ -1243,16 +1281,21 @@ mod tests {
12431281
use crate::statistics::TrackerStatisticsEvent;
12441282
use crate::tracker::tracker::TorrentTracker;
12451283
use crate::udp::handlers::handle_scrape;
1246-
use crate::udp::handlers::tests::{default_tracker_config, sample_ipv4_remote_addr, TrackerStatsServiceMock};
1284+
use crate::udp::handlers::tests::{
1285+
default_tracker_config, sample_ipv4_remote_addr, StatsEventSenderMock, TrackerStatsServiceMock,
1286+
};
12471287

12481288
#[tokio::test]
12491289
async fn should_send_the_upd4_scrape_event() {
12501290
let mut tracker_stats_service = Box::new(TrackerStatsServiceMock::new());
1291+
let stats_event_sender = Box::new(StatsEventSenderMock::new());
12511292

12521293
tracker_stats_service.should_throw_event(TrackerStatisticsEvent::Udp4Scrape);
12531294

12541295
let remote_addr = sample_ipv4_remote_addr();
1255-
let tracker = Arc::new(TorrentTracker::new(default_tracker_config(), tracker_stats_service).unwrap());
1296+
let tracker = Arc::new(
1297+
TorrentTracker::new(default_tracker_config(), tracker_stats_service, Some(stats_event_sender)).unwrap(),
1298+
);
12561299

12571300
handle_scrape(remote_addr, &sample_scrape_request(&remote_addr), tracker.clone())
12581301
.await
@@ -1267,16 +1310,21 @@ mod tests {
12671310
use crate::statistics::TrackerStatisticsEvent;
12681311
use crate::tracker::tracker::TorrentTracker;
12691312
use crate::udp::handlers::handle_scrape;
1270-
use crate::udp::handlers::tests::{default_tracker_config, sample_ipv6_remote_addr, TrackerStatsServiceMock};
1313+
use crate::udp::handlers::tests::{
1314+
default_tracker_config, sample_ipv6_remote_addr, StatsEventSenderMock, TrackerStatsServiceMock,
1315+
};
12711316

12721317
#[tokio::test]
12731318
async fn should_send_the_upd6_scrape_event() {
12741319
let mut tracker_stats_service = Box::new(TrackerStatsServiceMock::new());
1320+
let stats_event_sender = Box::new(StatsEventSenderMock::new());
12751321

12761322
tracker_stats_service.should_throw_event(TrackerStatisticsEvent::Udp6Scrape);
12771323

12781324
let remote_addr = sample_ipv6_remote_addr();
1279-
let tracker = Arc::new(TorrentTracker::new(default_tracker_config(), tracker_stats_service).unwrap());
1325+
let tracker = Arc::new(
1326+
TorrentTracker::new(default_tracker_config(), tracker_stats_service, Some(stats_event_sender)).unwrap(),
1327+
);
12801328

12811329
handle_scrape(remote_addr, &sample_scrape_request(&remote_addr), tracker.clone())
12821330
.await

tests/udp.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,11 @@ mod udp_tracker_server {
5151
lazy_static::initialize(&static_time::TIME_AT_APP_START);
5252

5353
// Initialize stats tracker
54-
let stats_tracker = StatsTracker::new_active_instance();
54+
let (stats_tracker, stats_event_sender) = StatsTracker::new_active_instance();
5555

5656
// Initialize Torrust tracker
57-
let tracker = match TorrentTracker::new(configuration.clone(), Box::new(stats_tracker)) {
57+
let tracker = match TorrentTracker::new(configuration.clone(), Box::new(stats_tracker), Some(stats_event_sender))
58+
{
5859
Ok(tracker) => Arc::new(tracker),
5960
Err(error) => {
6061
panic!("{}", error)

0 commit comments

Comments
 (0)