Skip to content

Commit d3297cf

Browse files
committed
refactor: extract StatsRepository
1 parent 8874032 commit d3297cf

File tree

6 files changed

+81
-110
lines changed

6 files changed

+81
-110
lines changed

src/main.rs

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

2626
// Initialize statistics
27-
let (stats_tracker, stats_event_sender) = setup_statistics(config.tracker_usage_statistics);
27+
let (stats_event_sender, stats_repository) = setup_statistics(config.tracker_usage_statistics);
2828

2929
// Initialize Torrust tracker
30-
let tracker = match TorrentTracker::new(config.clone(), Box::new(stats_tracker), stats_event_sender) {
30+
let tracker = match TorrentTracker::new(config.clone(), stats_event_sender, stats_repository) {
3131
Ok(tracker) => Arc::new(tracker),
3232
Err(error) => {
3333
panic!("{}", error)

src/stats.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
use crate::statistics::{StatsTracker, TrackerStatisticsEventSender};
2-
3-
pub fn setup_statistics(tracker_usage_statistics: bool) -> (StatsTracker, Option<Box<dyn TrackerStatisticsEventSender>>) {
4-
let mut stats_tracker = StatsTracker::new_inactive_instance();
1+
use crate::statistics::{StatsRepository, StatsTracker, TrackerStatisticsEventSender};
52

3+
pub fn setup_statistics(tracker_usage_statistics: bool) -> (Option<Box<dyn TrackerStatisticsEventSender>>, StatsRepository) {
64
let mut stats_event_sender = None;
75

6+
let mut stats_tracker = StatsTracker::new();
7+
88
if tracker_usage_statistics {
9-
stats_event_sender = Some(stats_tracker.run_worker());
9+
stats_event_sender = Some(stats_tracker.run_event_listener());
1010
}
1111

12-
(stats_tracker, stats_event_sender)
12+
(stats_event_sender, stats_tracker.stats_repository)
1313
}
1414

1515
#[cfg(test)]
@@ -20,7 +20,7 @@ mod test {
2020
async fn should_not_send_any_event_when_statistics_are_disabled() {
2121
let tracker_usage_statistics = false;
2222

23-
let (_stats_tracker, stats_event_sender) = setup_statistics(tracker_usage_statistics);
23+
let (stats_event_sender, _stats_repository) = setup_statistics(tracker_usage_statistics);
2424

2525
assert!(stats_event_sender.is_none());
2626
}
@@ -29,7 +29,7 @@ mod test {
2929
async fn should_send_events_when_statistics_are_enabled() {
3030
let tracker_usage_statistics = true;
3131

32-
let (_stats_tracker, stats_event_sender) = setup_statistics(tracker_usage_statistics);
32+
let (stats_event_sender, _stats_repository) = setup_statistics(tracker_usage_statistics);
3333

3434
assert!(stats_event_sender.is_some());
3535
}

src/tracker/statistics.rs

Lines changed: 41 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,12 @@ pub struct TrackerStatistics {
4040
pub udp6_scrapes_handled: u64,
4141
}
4242

43+
impl Default for TrackerStatistics {
44+
fn default() -> Self {
45+
Self::new()
46+
}
47+
}
48+
4349
impl TrackerStatistics {
4450
pub fn new() -> Self {
4551
Self {
@@ -60,56 +66,44 @@ impl TrackerStatistics {
6066
}
6167

6268
pub struct StatsTracker {
63-
pub stats: Arc<RwLock<TrackerStatistics>>,
69+
pub stats_repository: StatsRepository,
6470
}
6571

66-
impl StatsTracker {
67-
pub fn new_active_instance() -> (Self, Box<dyn TrackerStatisticsEventSender>) {
68-
let mut stats_tracker = Self {
69-
stats: Arc::new(RwLock::new(TrackerStatistics::new())),
70-
};
71-
72-
let stats_event_sender = stats_tracker.run_worker();
73-
74-
(stats_tracker, stats_event_sender)
75-
}
76-
77-
pub fn new_inactive_instance() -> Self {
78-
Self {
79-
stats: Arc::new(RwLock::new(TrackerStatistics::new())),
80-
}
72+
impl Default for StatsTracker {
73+
fn default() -> Self {
74+
Self::new()
8175
}
76+
}
8277

83-
pub fn new_instance(active: bool) -> Self {
84-
if !active {
85-
return Self::new_inactive_instance();
86-
}
78+
impl StatsTracker {
79+
pub fn new_active_instance() -> (Box<dyn TrackerStatisticsEventSender>, StatsRepository) {
80+
let mut stats_tracker = Self::new();
8781

88-
let (stats_tracker, _stats_event_sender) = Self::new_active_instance();
82+
let stats_event_sender = stats_tracker.run_event_listener();
8983

90-
stats_tracker
84+
(stats_event_sender, stats_tracker.stats_repository)
9185
}
9286

9387
pub fn new() -> Self {
9488
Self {
95-
stats: Arc::new(RwLock::new(TrackerStatistics::new())),
89+
stats_repository: StatsRepository::new(),
9690
}
9791
}
9892

99-
pub fn run_worker(&mut self) -> Box<dyn TrackerStatisticsEventSender> {
100-
let (tx, rx) = mpsc::channel::<TrackerStatisticsEvent>(CHANNEL_BUFFER_SIZE);
93+
pub fn run_event_listener(&mut self) -> Box<dyn TrackerStatisticsEventSender> {
94+
let (sender, receiver) = mpsc::channel::<TrackerStatisticsEvent>(CHANNEL_BUFFER_SIZE);
10195

102-
let stats = self.stats.clone();
96+
let stats_repository = self.stats_repository.clone();
10397

104-
tokio::spawn(async move { event_listener(rx, stats).await });
98+
tokio::spawn(async move { event_listener(receiver, stats_repository).await });
10599

106-
Box::new(StatsEventSender { sender: tx })
100+
Box::new(StatsEventSender { sender })
107101
}
108102
}
109103

110-
async fn event_listener(mut rx: Receiver<TrackerStatisticsEvent>, stats: Arc<RwLock<TrackerStatistics>>) {
111-
while let Some(event) = rx.recv().await {
112-
let mut stats_lock = stats.write().await;
104+
async fn event_listener(mut receiver: Receiver<TrackerStatisticsEvent>, stats_repository: StatsRepository) {
105+
while let Some(event) = receiver.recv().await {
106+
let mut stats_lock = stats_repository.stats.write().await;
113107

114108
match event {
115109
TrackerStatisticsEvent::Tcp4Announce => {
@@ -171,18 +165,25 @@ impl TrackerStatisticsEventSender for StatsEventSender {
171165
}
172166
}
173167

174-
#[async_trait]
175-
pub trait TrackerStatisticsRepository: Sync + Send {
176-
async fn get_stats(&self) -> RwLockReadGuard<'_, TrackerStatistics>;
168+
#[derive(Clone)]
169+
pub struct StatsRepository {
170+
pub stats: Arc<RwLock<TrackerStatistics>>,
177171
}
178172

179-
#[async_trait]
180-
impl TrackerStatisticsRepository for StatsTracker {
181-
async fn get_stats(&self) -> RwLockReadGuard<'_, TrackerStatistics> {
182-
self.stats.read().await
173+
impl Default for StatsRepository {
174+
fn default() -> Self {
175+
Self::new()
183176
}
184177
}
185178

186-
pub trait TrackerStatsService: TrackerStatisticsRepository {}
179+
impl StatsRepository {
180+
pub fn new() -> Self {
181+
Self {
182+
stats: Arc::new(RwLock::new(TrackerStatistics::new())),
183+
}
184+
}
187185

188-
impl TrackerStatsService for StatsTracker {}
186+
pub async fn get_stats(&self) -> RwLockReadGuard<'_, TrackerStatistics> {
187+
self.stats.read().await
188+
}
189+
}

src/tracker/tracker.rs

Lines changed: 5 additions & 5 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, TrackerStatisticsEventSender, TrackerStatsService};
15+
use crate::statistics::{StatsRepository, TrackerStatistics, TrackerStatisticsEvent, TrackerStatisticsEventSender};
1616
use crate::tracker::key;
1717
use crate::tracker::key::AuthKey;
1818
use crate::tracker::torrent::{TorrentEntry, TorrentError, TorrentStats};
@@ -24,16 +24,16 @@ pub struct TorrentTracker {
2424
keys: RwLock<std::collections::HashMap<String, AuthKey>>,
2525
whitelist: RwLock<std::collections::HashSet<InfoHash>>,
2626
torrents: RwLock<std::collections::BTreeMap<InfoHash, TorrentEntry>>,
27-
stats_tracker: Box<dyn TrackerStatsService>,
2827
stats_event_sender: Option<Box<dyn TrackerStatisticsEventSender>>,
28+
stats_repository: StatsRepository,
2929
database: Box<dyn Database>,
3030
}
3131

3232
impl TorrentTracker {
3333
pub fn new(
3434
config: Arc<Configuration>,
35-
stats_tracker: Box<dyn TrackerStatsService>,
3635
stats_event_sender: Option<Box<dyn TrackerStatisticsEventSender>>,
36+
stats_repository: StatsRepository,
3737
) -> Result<TorrentTracker, r2d2::Error> {
3838
let database = database::connect_database(&config.db_driver, &config.db_path)?;
3939

@@ -43,8 +43,8 @@ impl TorrentTracker {
4343
keys: RwLock::new(std::collections::HashMap::new()),
4444
whitelist: RwLock::new(std::collections::HashSet::new()),
4545
torrents: RwLock::new(std::collections::BTreeMap::new()),
46-
stats_tracker,
4746
stats_event_sender,
47+
stats_repository,
4848
database,
4949
})
5050
}
@@ -238,7 +238,7 @@ impl TorrentTracker {
238238
}
239239

240240
pub async fn get_stats(&self) -> RwLockReadGuard<'_, TrackerStatistics> {
241-
self.stats_tracker.get_stats().await
241+
self.stats_repository.get_stats().await
242242
}
243243

244244
pub async fn send_stats_event(&self, event: TrackerStatisticsEvent) -> Option<Result<(), SendError<TrackerStatisticsEvent>>> {

0 commit comments

Comments
 (0)