From 2020162422f21143aabb0826a409b908cd02b82f Mon Sep 17 00:00:00 2001 From: Jose Celano Date: Fri, 7 Mar 2025 08:36:11 +0000 Subject: [PATCH 1/2] chore: [#1243] minor changes in comments and format --- packages/primitives/src/swarm_metadata.rs | 15 ++++++++++----- packages/primitives/src/torrent_metrics.rs | 10 +++++++--- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/primitives/src/swarm_metadata.rs b/packages/primitives/src/swarm_metadata.rs index ca880b54d..68d354e21 100644 --- a/packages/primitives/src/swarm_metadata.rs +++ b/packages/primitives/src/swarm_metadata.rs @@ -6,11 +6,16 @@ use derive_more::Constructor; /// See [BEP 48: Tracker Protocol Extension: Scrape](https://www.bittorrent.org/beps/bep_0048.html) #[derive(Copy, Clone, Debug, PartialEq, Default, Constructor)] pub struct SwarmMetadata { - /// (i.e `completed`): The number of peers that have ever completed downloading - pub downloaded: u32, // - /// (i.e `seeders`): The number of active peers that have completed downloading (seeders) - pub complete: u32, //seeders - /// (i.e `leechers`): The number of active peers that have not completed downloading (leechers) + /// (i.e `completed`): The number of peers that have ever completed + /// downloading a given torrent. + pub downloaded: u32, + + /// (i.e `seeders`): The number of active peers that have completed + /// downloading (seeders) a given torrent. + pub complete: u32, + + /// (i.e `leechers`): The number of active peers that have not completed + /// downloading (leechers) a given torrent. pub incomplete: u32, } diff --git a/packages/primitives/src/torrent_metrics.rs b/packages/primitives/src/torrent_metrics.rs index 02de02954..51c96a3ee 100644 --- a/packages/primitives/src/torrent_metrics.rs +++ b/packages/primitives/src/torrent_metrics.rs @@ -5,12 +5,16 @@ use std::ops::AddAssign; /// Metrics are aggregate values for all torrents. #[derive(Copy, Clone, Debug, PartialEq, Default)] pub struct TorrentsMetrics { - /// Total number of seeders for all torrents - pub complete: u64, - /// Total number of peers that have ever completed downloading for all torrents. + /// Total number of peers that have ever completed downloading for all + /// torrents. pub downloaded: u64, + + /// Total number of seeders for all torrents. + pub complete: u64, + /// Total number of leechers for all torrents. pub incomplete: u64, + /// Total number of torrents. pub torrents: u64, } From 144a338b9cfc4b82a0cc19be54e906684d20e8df Mon Sep 17 00:00:00 2001 From: Jose Celano Date: Fri, 7 Mar 2025 08:55:40 +0000 Subject: [PATCH 2/2] refactor: [#1243] move and rename struct and fields (AggregateSwarmMetadata) To avoid confusion with `SwarmMetadata` - `SwarmMetadata`: metrics for one torrent. - `AggregateSwarmMetadata`: metrics for all torrents. --- .../src/v1/context/stats/resources.rs | 20 ++--- .../src/v1/context/stats/responses.rs | 8 +- .../src/statistics/services.rs | 8 +- packages/primitives/src/lib.rs | 1 - packages/primitives/src/swarm_metadata.rs | 37 +++++++- packages/primitives/src/torrent_metrics.rs | 29 ------ .../src/statistics/services.rs | 8 +- .../src/repository/dash_map_mutex_std.rs | 15 ++-- .../torrent-repository/src/repository/mod.rs | 7 +- .../src/repository/rw_lock_std.rs | 15 ++-- .../src/repository/rw_lock_std_mutex_std.rs | 15 ++-- .../src/repository/rw_lock_std_mutex_tokio.rs | 15 ++-- .../src/repository/rw_lock_tokio.rs | 15 ++-- .../src/repository/rw_lock_tokio_mutex_std.rs | 15 ++-- .../repository/rw_lock_tokio_mutex_tokio.rs | 15 ++-- .../src/repository/skip_map_mutex_std.rs | 39 ++++---- .../torrent-repository/tests/common/repo.rs | 5 +- .../tests/repository/mod.rs | 20 ++--- .../src/torrent/repository/in_memory.rs | 89 +++++++++---------- .../src/statistics/services.rs | 8 +- .../src/statistics/services.rs | 8 +- 21 files changed, 191 insertions(+), 201 deletions(-) delete mode 100644 packages/primitives/src/torrent_metrics.rs diff --git a/packages/axum-rest-tracker-api-server/src/v1/context/stats/resources.rs b/packages/axum-rest-tracker-api-server/src/v1/context/stats/resources.rs index 9a82593c7..9ed61cc6b 100644 --- a/packages/axum-rest-tracker-api-server/src/v1/context/stats/resources.rs +++ b/packages/axum-rest-tracker-api-server/src/v1/context/stats/resources.rs @@ -79,10 +79,10 @@ pub struct Stats { impl From for Stats { fn from(metrics: TrackerMetrics) -> Self { Self { - torrents: metrics.torrents_metrics.torrents, - seeders: metrics.torrents_metrics.complete, - completed: metrics.torrents_metrics.downloaded, - leechers: metrics.torrents_metrics.incomplete, + torrents: metrics.torrents_metrics.total_torrents, + seeders: metrics.torrents_metrics.total_complete, + completed: metrics.torrents_metrics.total_downloaded, + leechers: metrics.torrents_metrics.total_incomplete, // TCP tcp4_connections_handled: metrics.protocol_metrics.tcp4_connections_handled, tcp4_announces_handled: metrics.protocol_metrics.tcp4_announces_handled, @@ -119,7 +119,7 @@ impl From for Stats { mod tests { use torrust_rest_tracker_api_core::statistics::metrics::Metrics; use torrust_rest_tracker_api_core::statistics::services::TrackerMetrics; - use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; + use torrust_tracker_primitives::swarm_metadata::AggregateSwarmMetadata; use super::Stats; @@ -127,11 +127,11 @@ mod tests { fn stats_resource_should_be_converted_from_tracker_metrics() { assert_eq!( Stats::from(TrackerMetrics { - torrents_metrics: TorrentsMetrics { - complete: 1, - downloaded: 2, - incomplete: 3, - torrents: 4 + torrents_metrics: AggregateSwarmMetadata { + total_complete: 1, + total_downloaded: 2, + total_incomplete: 3, + total_torrents: 4 }, protocol_metrics: Metrics { // TCP diff --git a/packages/axum-rest-tracker-api-server/src/v1/context/stats/responses.rs b/packages/axum-rest-tracker-api-server/src/v1/context/stats/responses.rs index 61455178c..6d279726c 100644 --- a/packages/axum-rest-tracker-api-server/src/v1/context/stats/responses.rs +++ b/packages/axum-rest-tracker-api-server/src/v1/context/stats/responses.rs @@ -16,10 +16,10 @@ pub fn stats_response(tracker_metrics: TrackerMetrics) -> Response { pub fn metrics_response(tracker_metrics: &TrackerMetrics) -> Response { let mut lines = vec![]; - lines.push(format!("torrents {}", tracker_metrics.torrents_metrics.torrents)); - lines.push(format!("seeders {}", tracker_metrics.torrents_metrics.complete)); - lines.push(format!("completed {}", tracker_metrics.torrents_metrics.downloaded)); - lines.push(format!("leechers {}", tracker_metrics.torrents_metrics.incomplete)); + lines.push(format!("torrents {}", tracker_metrics.torrents_metrics.total_torrents)); + lines.push(format!("seeders {}", tracker_metrics.torrents_metrics.total_complete)); + lines.push(format!("completed {}", tracker_metrics.torrents_metrics.total_downloaded)); + lines.push(format!("leechers {}", tracker_metrics.torrents_metrics.total_incomplete)); // TCP diff --git a/packages/http-tracker-core/src/statistics/services.rs b/packages/http-tracker-core/src/statistics/services.rs index 57806677e..f7808440a 100644 --- a/packages/http-tracker-core/src/statistics/services.rs +++ b/packages/http-tracker-core/src/statistics/services.rs @@ -23,7 +23,7 @@ use std::sync::Arc; use bittorrent_tracker_core::torrent::repository::in_memory::InMemoryTorrentRepository; -use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; +use torrust_tracker_primitives::swarm_metadata::AggregateSwarmMetadata; use crate::statistics::metrics::Metrics; use crate::statistics::repository::Repository; @@ -34,7 +34,7 @@ pub struct TrackerMetrics { /// Domain level metrics. /// /// General metrics for all torrents (number of seeders, leechers, etcetera) - pub torrents_metrics: TorrentsMetrics, + pub torrents_metrics: AggregateSwarmMetadata, /// Application level metrics. Usage statistics/metrics. /// @@ -72,7 +72,7 @@ mod tests { use bittorrent_tracker_core::torrent::repository::in_memory::InMemoryTorrentRepository; use bittorrent_tracker_core::{self}; use torrust_tracker_configuration::Configuration; - use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; + use torrust_tracker_primitives::swarm_metadata::AggregateSwarmMetadata; use torrust_tracker_test_helpers::configuration; use crate::statistics; @@ -96,7 +96,7 @@ mod tests { assert_eq!( tracker_metrics, TrackerMetrics { - torrents_metrics: TorrentsMetrics::default(), + torrents_metrics: AggregateSwarmMetadata::default(), protocol_metrics: statistics::metrics::Metrics::default(), } ); diff --git a/packages/primitives/src/lib.rs b/packages/primitives/src/lib.rs index ec9732778..b50516893 100644 --- a/packages/primitives/src/lib.rs +++ b/packages/primitives/src/lib.rs @@ -8,7 +8,6 @@ pub mod core; pub mod pagination; pub mod peer; pub mod swarm_metadata; -pub mod torrent_metrics; use std::collections::BTreeMap; use std::time::Duration; diff --git a/packages/primitives/src/swarm_metadata.rs b/packages/primitives/src/swarm_metadata.rs index 68d354e21..792eff632 100644 --- a/packages/primitives/src/swarm_metadata.rs +++ b/packages/primitives/src/swarm_metadata.rs @@ -1,20 +1,23 @@ +use std::ops::AddAssign; + use derive_more::Constructor; /// Swarm statistics for one torrent. +/// /// Swarm metadata dictionary in the scrape response. /// /// See [BEP 48: Tracker Protocol Extension: Scrape](https://www.bittorrent.org/beps/bep_0048.html) #[derive(Copy, Clone, Debug, PartialEq, Default, Constructor)] pub struct SwarmMetadata { - /// (i.e `completed`): The number of peers that have ever completed + /// (i.e `completed`): The number of peers that have ever completed /// downloading a given torrent. pub downloaded: u32, - /// (i.e `seeders`): The number of active peers that have completed + /// (i.e `seeders`): The number of active peers that have completed /// downloading (seeders) a given torrent. pub complete: u32, - /// (i.e `leechers`): The number of active peers that have not completed + /// (i.e `leechers`): The number of active peers that have not completed /// downloading (leechers) a given torrent. pub incomplete: u32, } @@ -25,3 +28,31 @@ impl SwarmMetadata { Self::default() } } + +/// Structure that holds aggregate swarm metadata. +/// +/// Metrics are aggregate values for all torrents. +#[derive(Copy, Clone, Debug, PartialEq, Default)] +pub struct AggregateSwarmMetadata { + /// Total number of peers that have ever completed downloading for all + /// torrents. + pub total_downloaded: u64, + + /// Total number of seeders for all torrents. + pub total_complete: u64, + + /// Total number of leechers for all torrents. + pub total_incomplete: u64, + + /// Total number of torrents. + pub total_torrents: u64, +} + +impl AddAssign for AggregateSwarmMetadata { + fn add_assign(&mut self, rhs: Self) { + self.total_complete += rhs.total_complete; + self.total_downloaded += rhs.total_downloaded; + self.total_incomplete += rhs.total_incomplete; + self.total_torrents += rhs.total_torrents; + } +} diff --git a/packages/primitives/src/torrent_metrics.rs b/packages/primitives/src/torrent_metrics.rs deleted file mode 100644 index 51c96a3ee..000000000 --- a/packages/primitives/src/torrent_metrics.rs +++ /dev/null @@ -1,29 +0,0 @@ -use std::ops::AddAssign; - -/// Structure that holds general `Tracker` torrents metrics. -/// -/// Metrics are aggregate values for all torrents. -#[derive(Copy, Clone, Debug, PartialEq, Default)] -pub struct TorrentsMetrics { - /// Total number of peers that have ever completed downloading for all - /// torrents. - pub downloaded: u64, - - /// Total number of seeders for all torrents. - pub complete: u64, - - /// Total number of leechers for all torrents. - pub incomplete: u64, - - /// Total number of torrents. - pub torrents: u64, -} - -impl AddAssign for TorrentsMetrics { - fn add_assign(&mut self, rhs: Self) { - self.complete += rhs.complete; - self.downloaded += rhs.downloaded; - self.incomplete += rhs.incomplete; - self.torrents += rhs.torrents; - } -} diff --git a/packages/rest-tracker-api-core/src/statistics/services.rs b/packages/rest-tracker-api-core/src/statistics/services.rs index c4dfcf533..ea4e159b6 100644 --- a/packages/rest-tracker-api-core/src/statistics/services.rs +++ b/packages/rest-tracker-api-core/src/statistics/services.rs @@ -4,7 +4,7 @@ use bittorrent_tracker_core::torrent::repository::in_memory::InMemoryTorrentRepo use bittorrent_udp_tracker_core::services::banning::BanService; use bittorrent_udp_tracker_core::{self, statistics as udp_core_statistics}; use tokio::sync::RwLock; -use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; +use torrust_tracker_primitives::swarm_metadata::AggregateSwarmMetadata; use torrust_udp_tracker_server::statistics as udp_server_statistics; use crate::statistics::metrics::Metrics; @@ -15,7 +15,7 @@ pub struct TrackerMetrics { /// Domain level metrics. /// /// General metrics for all torrents (number of seeders, leechers, etcetera) - pub torrents_metrics: TorrentsMetrics, + pub torrents_metrics: AggregateSwarmMetadata, /// Application level metrics. Usage statistics/metrics. /// @@ -83,7 +83,7 @@ mod tests { use bittorrent_udp_tracker_core::MAX_CONNECTION_ID_ERRORS_PER_IP; use tokio::sync::RwLock; use torrust_tracker_configuration::Configuration; - use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; + use torrust_tracker_primitives::swarm_metadata::AggregateSwarmMetadata; use torrust_tracker_test_helpers::configuration; use crate::statistics::metrics::Metrics; @@ -127,7 +127,7 @@ mod tests { assert_eq!( tracker_metrics, TrackerMetrics { - torrents_metrics: TorrentsMetrics::default(), + torrents_metrics: AggregateSwarmMetadata::default(), protocol_metrics: Metrics::default(), } ); diff --git a/packages/torrent-repository/src/repository/dash_map_mutex_std.rs b/packages/torrent-repository/src/repository/dash_map_mutex_std.rs index 9e2b5cc59..d4a84caa0 100644 --- a/packages/torrent-repository/src/repository/dash_map_mutex_std.rs +++ b/packages/torrent-repository/src/repository/dash_map_mutex_std.rs @@ -4,8 +4,7 @@ use bittorrent_primitives::info_hash::InfoHash; use dashmap::DashMap; use torrust_tracker_configuration::TrackerPolicy; use torrust_tracker_primitives::pagination::Pagination; -use torrust_tracker_primitives::swarm_metadata::SwarmMetadata; -use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; +use torrust_tracker_primitives::swarm_metadata::{AggregateSwarmMetadata, SwarmMetadata}; use torrust_tracker_primitives::{peer, DurationSinceUnixEpoch, PersistentTorrent, PersistentTorrents}; use super::Repository; @@ -47,15 +46,15 @@ where maybe_entry.map(|entry| entry.clone()) } - fn get_metrics(&self) -> TorrentsMetrics { - let mut metrics = TorrentsMetrics::default(); + fn get_metrics(&self) -> AggregateSwarmMetadata { + let mut metrics = AggregateSwarmMetadata::default(); for entry in &self.torrents { let stats = entry.value().lock().expect("it should get a lock").get_swarm_metadata(); - metrics.complete += u64::from(stats.complete); - metrics.downloaded += u64::from(stats.downloaded); - metrics.incomplete += u64::from(stats.incomplete); - metrics.torrents += 1; + metrics.total_complete += u64::from(stats.complete); + metrics.total_downloaded += u64::from(stats.downloaded); + metrics.total_incomplete += u64::from(stats.incomplete); + metrics.total_torrents += 1; } metrics diff --git a/packages/torrent-repository/src/repository/mod.rs b/packages/torrent-repository/src/repository/mod.rs index 16ebdf3c1..9284ff6e6 100644 --- a/packages/torrent-repository/src/repository/mod.rs +++ b/packages/torrent-repository/src/repository/mod.rs @@ -1,8 +1,7 @@ use bittorrent_primitives::info_hash::InfoHash; use torrust_tracker_configuration::TrackerPolicy; use torrust_tracker_primitives::pagination::Pagination; -use torrust_tracker_primitives::swarm_metadata::SwarmMetadata; -use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; +use torrust_tracker_primitives::swarm_metadata::{AggregateSwarmMetadata, SwarmMetadata}; use torrust_tracker_primitives::{peer, DurationSinceUnixEpoch, PersistentTorrent, PersistentTorrents}; pub mod dash_map_mutex_std; @@ -18,7 +17,7 @@ use std::fmt::Debug; pub trait Repository: Debug + Default + Sized + 'static { fn get(&self, key: &InfoHash) -> Option; - fn get_metrics(&self) -> TorrentsMetrics; + fn get_metrics(&self) -> AggregateSwarmMetadata; fn get_paginated(&self, pagination: Option<&Pagination>) -> Vec<(InfoHash, T)>; fn import_persistent(&self, persistent_torrents: &PersistentTorrents); fn remove(&self, key: &InfoHash) -> Option; @@ -31,7 +30,7 @@ pub trait Repository: Debug + Default + Sized + 'static { #[allow(clippy::module_name_repetitions)] pub trait RepositoryAsync: Debug + Default + Sized + 'static { fn get(&self, key: &InfoHash) -> impl std::future::Future> + Send; - fn get_metrics(&self) -> impl std::future::Future + Send; + fn get_metrics(&self) -> impl std::future::Future + Send; fn get_paginated(&self, pagination: Option<&Pagination>) -> impl std::future::Future> + Send; fn import_persistent(&self, persistent_torrents: &PersistentTorrents) -> impl std::future::Future + Send; fn remove(&self, key: &InfoHash) -> impl std::future::Future> + Send; diff --git a/packages/torrent-repository/src/repository/rw_lock_std.rs b/packages/torrent-repository/src/repository/rw_lock_std.rs index 7038b0b38..d190718af 100644 --- a/packages/torrent-repository/src/repository/rw_lock_std.rs +++ b/packages/torrent-repository/src/repository/rw_lock_std.rs @@ -1,8 +1,7 @@ use bittorrent_primitives::info_hash::InfoHash; use torrust_tracker_configuration::TrackerPolicy; use torrust_tracker_primitives::pagination::Pagination; -use torrust_tracker_primitives::swarm_metadata::SwarmMetadata; -use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; +use torrust_tracker_primitives::swarm_metadata::{AggregateSwarmMetadata, SwarmMetadata}; use torrust_tracker_primitives::{peer, DurationSinceUnixEpoch, PersistentTorrent, PersistentTorrents}; use super::Repository; @@ -65,15 +64,15 @@ where db.get(key).cloned() } - fn get_metrics(&self) -> TorrentsMetrics { - let mut metrics = TorrentsMetrics::default(); + fn get_metrics(&self) -> AggregateSwarmMetadata { + let mut metrics = AggregateSwarmMetadata::default(); for entry in self.get_torrents().values() { let stats = entry.get_swarm_metadata(); - metrics.complete += u64::from(stats.complete); - metrics.downloaded += u64::from(stats.downloaded); - metrics.incomplete += u64::from(stats.incomplete); - metrics.torrents += 1; + metrics.total_complete += u64::from(stats.complete); + metrics.total_downloaded += u64::from(stats.downloaded); + metrics.total_incomplete += u64::from(stats.incomplete); + metrics.total_torrents += 1; } metrics diff --git a/packages/torrent-repository/src/repository/rw_lock_std_mutex_std.rs b/packages/torrent-repository/src/repository/rw_lock_std_mutex_std.rs index a9958bd7c..1764b94e8 100644 --- a/packages/torrent-repository/src/repository/rw_lock_std_mutex_std.rs +++ b/packages/torrent-repository/src/repository/rw_lock_std_mutex_std.rs @@ -3,8 +3,7 @@ use std::sync::Arc; use bittorrent_primitives::info_hash::InfoHash; use torrust_tracker_configuration::TrackerPolicy; use torrust_tracker_primitives::pagination::Pagination; -use torrust_tracker_primitives::swarm_metadata::SwarmMetadata; -use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; +use torrust_tracker_primitives::swarm_metadata::{AggregateSwarmMetadata, SwarmMetadata}; use torrust_tracker_primitives::{peer, DurationSinceUnixEpoch, PersistentTorrent, PersistentTorrents}; use super::Repository; @@ -60,15 +59,15 @@ where db.get(key).cloned() } - fn get_metrics(&self) -> TorrentsMetrics { - let mut metrics = TorrentsMetrics::default(); + fn get_metrics(&self) -> AggregateSwarmMetadata { + let mut metrics = AggregateSwarmMetadata::default(); for entry in self.get_torrents().values() { let stats = entry.lock().expect("it should get a lock").get_swarm_metadata(); - metrics.complete += u64::from(stats.complete); - metrics.downloaded += u64::from(stats.downloaded); - metrics.incomplete += u64::from(stats.incomplete); - metrics.torrents += 1; + metrics.total_complete += u64::from(stats.complete); + metrics.total_downloaded += u64::from(stats.downloaded); + metrics.total_incomplete += u64::from(stats.incomplete); + metrics.total_torrents += 1; } metrics diff --git a/packages/torrent-repository/src/repository/rw_lock_std_mutex_tokio.rs b/packages/torrent-repository/src/repository/rw_lock_std_mutex_tokio.rs index deba42b67..116c1ff87 100644 --- a/packages/torrent-repository/src/repository/rw_lock_std_mutex_tokio.rs +++ b/packages/torrent-repository/src/repository/rw_lock_std_mutex_tokio.rs @@ -7,8 +7,7 @@ use futures::future::join_all; use futures::{Future, FutureExt}; use torrust_tracker_configuration::TrackerPolicy; use torrust_tracker_primitives::pagination::Pagination; -use torrust_tracker_primitives::swarm_metadata::SwarmMetadata; -use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; +use torrust_tracker_primitives::swarm_metadata::{AggregateSwarmMetadata, SwarmMetadata}; use torrust_tracker_primitives::{peer, DurationSinceUnixEpoch, PersistentTorrent, PersistentTorrents}; use super::RepositoryAsync; @@ -86,17 +85,17 @@ where } } - async fn get_metrics(&self) -> TorrentsMetrics { - let mut metrics = TorrentsMetrics::default(); + async fn get_metrics(&self) -> AggregateSwarmMetadata { + let mut metrics = AggregateSwarmMetadata::default(); let entries: Vec<_> = self.get_torrents().values().cloned().collect(); for entry in entries { let stats = entry.lock().await.get_swarm_metadata(); - metrics.complete += u64::from(stats.complete); - metrics.downloaded += u64::from(stats.downloaded); - metrics.incomplete += u64::from(stats.incomplete); - metrics.torrents += 1; + metrics.total_complete += u64::from(stats.complete); + metrics.total_downloaded += u64::from(stats.downloaded); + metrics.total_incomplete += u64::from(stats.incomplete); + metrics.total_torrents += 1; } metrics diff --git a/packages/torrent-repository/src/repository/rw_lock_tokio.rs b/packages/torrent-repository/src/repository/rw_lock_tokio.rs index bbda42f17..53838023d 100644 --- a/packages/torrent-repository/src/repository/rw_lock_tokio.rs +++ b/packages/torrent-repository/src/repository/rw_lock_tokio.rs @@ -1,8 +1,7 @@ use bittorrent_primitives::info_hash::InfoHash; use torrust_tracker_configuration::TrackerPolicy; use torrust_tracker_primitives::pagination::Pagination; -use torrust_tracker_primitives::swarm_metadata::SwarmMetadata; -use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; +use torrust_tracker_primitives::swarm_metadata::{AggregateSwarmMetadata, SwarmMetadata}; use torrust_tracker_primitives::{peer, DurationSinceUnixEpoch, PersistentTorrent, PersistentTorrents}; use super::RepositoryAsync; @@ -85,15 +84,15 @@ where } } - async fn get_metrics(&self) -> TorrentsMetrics { - let mut metrics = TorrentsMetrics::default(); + async fn get_metrics(&self) -> AggregateSwarmMetadata { + let mut metrics = AggregateSwarmMetadata::default(); for entry in self.get_torrents().await.values() { let stats = entry.get_swarm_metadata(); - metrics.complete += u64::from(stats.complete); - metrics.downloaded += u64::from(stats.downloaded); - metrics.incomplete += u64::from(stats.incomplete); - metrics.torrents += 1; + metrics.total_complete += u64::from(stats.complete); + metrics.total_downloaded += u64::from(stats.downloaded); + metrics.total_incomplete += u64::from(stats.incomplete); + metrics.total_torrents += 1; } metrics diff --git a/packages/torrent-repository/src/repository/rw_lock_tokio_mutex_std.rs b/packages/torrent-repository/src/repository/rw_lock_tokio_mutex_std.rs index 551c1c5ec..eb7e300fd 100644 --- a/packages/torrent-repository/src/repository/rw_lock_tokio_mutex_std.rs +++ b/packages/torrent-repository/src/repository/rw_lock_tokio_mutex_std.rs @@ -3,8 +3,7 @@ use std::sync::Arc; use bittorrent_primitives::info_hash::InfoHash; use torrust_tracker_configuration::TrackerPolicy; use torrust_tracker_primitives::pagination::Pagination; -use torrust_tracker_primitives::swarm_metadata::SwarmMetadata; -use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; +use torrust_tracker_primitives::swarm_metadata::{AggregateSwarmMetadata, SwarmMetadata}; use torrust_tracker_primitives::{peer, DurationSinceUnixEpoch, PersistentTorrent, PersistentTorrents}; use super::RepositoryAsync; @@ -79,15 +78,15 @@ where } } - async fn get_metrics(&self) -> TorrentsMetrics { - let mut metrics = TorrentsMetrics::default(); + async fn get_metrics(&self) -> AggregateSwarmMetadata { + let mut metrics = AggregateSwarmMetadata::default(); for entry in self.get_torrents().await.values() { let stats = entry.get_swarm_metadata(); - metrics.complete += u64::from(stats.complete); - metrics.downloaded += u64::from(stats.downloaded); - metrics.incomplete += u64::from(stats.incomplete); - metrics.torrents += 1; + metrics.total_complete += u64::from(stats.complete); + metrics.total_downloaded += u64::from(stats.downloaded); + metrics.total_incomplete += u64::from(stats.incomplete); + metrics.total_torrents += 1; } metrics diff --git a/packages/torrent-repository/src/repository/rw_lock_tokio_mutex_tokio.rs b/packages/torrent-repository/src/repository/rw_lock_tokio_mutex_tokio.rs index 3ac859ab0..c8ebaf4d6 100644 --- a/packages/torrent-repository/src/repository/rw_lock_tokio_mutex_tokio.rs +++ b/packages/torrent-repository/src/repository/rw_lock_tokio_mutex_tokio.rs @@ -3,8 +3,7 @@ use std::sync::Arc; use bittorrent_primitives::info_hash::InfoHash; use torrust_tracker_configuration::TrackerPolicy; use torrust_tracker_primitives::pagination::Pagination; -use torrust_tracker_primitives::swarm_metadata::SwarmMetadata; -use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; +use torrust_tracker_primitives::swarm_metadata::{AggregateSwarmMetadata, SwarmMetadata}; use torrust_tracker_primitives::{peer, DurationSinceUnixEpoch, PersistentTorrent, PersistentTorrents}; use super::RepositoryAsync; @@ -82,15 +81,15 @@ where } } - async fn get_metrics(&self) -> TorrentsMetrics { - let mut metrics = TorrentsMetrics::default(); + async fn get_metrics(&self) -> AggregateSwarmMetadata { + let mut metrics = AggregateSwarmMetadata::default(); for entry in self.get_torrents().await.values() { let stats = entry.get_swarm_metadata().await; - metrics.complete += u64::from(stats.complete); - metrics.downloaded += u64::from(stats.downloaded); - metrics.incomplete += u64::from(stats.incomplete); - metrics.torrents += 1; + metrics.total_complete += u64::from(stats.complete); + metrics.total_downloaded += u64::from(stats.downloaded); + metrics.total_incomplete += u64::from(stats.incomplete); + metrics.total_torrents += 1; } metrics diff --git a/packages/torrent-repository/src/repository/skip_map_mutex_std.rs b/packages/torrent-repository/src/repository/skip_map_mutex_std.rs index 2c4ff5ce7..8a15a9442 100644 --- a/packages/torrent-repository/src/repository/skip_map_mutex_std.rs +++ b/packages/torrent-repository/src/repository/skip_map_mutex_std.rs @@ -4,8 +4,7 @@ use bittorrent_primitives::info_hash::InfoHash; use crossbeam_skiplist::SkipMap; use torrust_tracker_configuration::TrackerPolicy; use torrust_tracker_primitives::pagination::Pagination; -use torrust_tracker_primitives::swarm_metadata::SwarmMetadata; -use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; +use torrust_tracker_primitives::swarm_metadata::{AggregateSwarmMetadata, SwarmMetadata}; use torrust_tracker_primitives::{peer, DurationSinceUnixEpoch, PersistentTorrent, PersistentTorrents}; use super::Repository; @@ -70,15 +69,15 @@ where maybe_entry.map(|entry| entry.value().clone()) } - fn get_metrics(&self) -> TorrentsMetrics { - let mut metrics = TorrentsMetrics::default(); + fn get_metrics(&self) -> AggregateSwarmMetadata { + let mut metrics = AggregateSwarmMetadata::default(); for entry in &self.torrents { let stats = entry.value().lock().expect("it should get a lock").get_swarm_metadata(); - metrics.complete += u64::from(stats.complete); - metrics.downloaded += u64::from(stats.downloaded); - metrics.incomplete += u64::from(stats.incomplete); - metrics.torrents += 1; + metrics.total_complete += u64::from(stats.complete); + metrics.total_downloaded += u64::from(stats.downloaded); + metrics.total_incomplete += u64::from(stats.incomplete); + metrics.total_torrents += 1; } metrics @@ -163,15 +162,15 @@ where maybe_entry.map(|entry| entry.value().clone()) } - fn get_metrics(&self) -> TorrentsMetrics { - let mut metrics = TorrentsMetrics::default(); + fn get_metrics(&self) -> AggregateSwarmMetadata { + let mut metrics = AggregateSwarmMetadata::default(); for entry in &self.torrents { let stats = entry.value().read().get_swarm_metadata(); - metrics.complete += u64::from(stats.complete); - metrics.downloaded += u64::from(stats.downloaded); - metrics.incomplete += u64::from(stats.incomplete); - metrics.torrents += 1; + metrics.total_complete += u64::from(stats.complete); + metrics.total_downloaded += u64::from(stats.downloaded); + metrics.total_incomplete += u64::from(stats.incomplete); + metrics.total_torrents += 1; } metrics @@ -256,15 +255,15 @@ where maybe_entry.map(|entry| entry.value().clone()) } - fn get_metrics(&self) -> TorrentsMetrics { - let mut metrics = TorrentsMetrics::default(); + fn get_metrics(&self) -> AggregateSwarmMetadata { + let mut metrics = AggregateSwarmMetadata::default(); for entry in &self.torrents { let stats = entry.value().lock().get_swarm_metadata(); - metrics.complete += u64::from(stats.complete); - metrics.downloaded += u64::from(stats.downloaded); - metrics.incomplete += u64::from(stats.incomplete); - metrics.torrents += 1; + metrics.total_complete += u64::from(stats.complete); + metrics.total_downloaded += u64::from(stats.downloaded); + metrics.total_incomplete += u64::from(stats.incomplete); + metrics.total_torrents += 1; } metrics diff --git a/packages/torrent-repository/tests/common/repo.rs b/packages/torrent-repository/tests/common/repo.rs index 65ce45f8e..224fc6aa3 100644 --- a/packages/torrent-repository/tests/common/repo.rs +++ b/packages/torrent-repository/tests/common/repo.rs @@ -1,8 +1,7 @@ use bittorrent_primitives::info_hash::InfoHash; use torrust_tracker_configuration::TrackerPolicy; use torrust_tracker_primitives::pagination::Pagination; -use torrust_tracker_primitives::swarm_metadata::SwarmMetadata; -use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; +use torrust_tracker_primitives::swarm_metadata::{AggregateSwarmMetadata, SwarmMetadata}; use torrust_tracker_primitives::{peer, DurationSinceUnixEpoch, PersistentTorrent, PersistentTorrents}; use torrust_tracker_torrent_repository::repository::{Repository as _, RepositoryAsync as _}; use torrust_tracker_torrent_repository::{ @@ -76,7 +75,7 @@ impl Repo { } } - pub(crate) async fn get_metrics(&self) -> TorrentsMetrics { + pub(crate) async fn get_metrics(&self) -> AggregateSwarmMetadata { match self { Repo::RwLockStd(repo) => repo.get_metrics(), Repo::RwLockStdMutexStd(repo) => repo.get_metrics(), diff --git a/packages/torrent-repository/tests/repository/mod.rs b/packages/torrent-repository/tests/repository/mod.rs index d38208e0d..77977837f 100644 --- a/packages/torrent-repository/tests/repository/mod.rs +++ b/packages/torrent-repository/tests/repository/mod.rs @@ -402,19 +402,19 @@ async fn it_should_get_metrics( repo: Repo, #[case] entries: Entries, ) { - use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; + use torrust_tracker_primitives::swarm_metadata::AggregateSwarmMetadata; make(&repo, &entries).await; - let mut metrics = TorrentsMetrics::default(); + let mut metrics = AggregateSwarmMetadata::default(); for (_, torrent) in entries { let stats = torrent.get_swarm_metadata(); - metrics.torrents += 1; - metrics.incomplete += u64::from(stats.incomplete); - metrics.complete += u64::from(stats.complete); - metrics.downloaded += u64::from(stats.downloaded); + metrics.total_torrents += 1; + metrics.total_incomplete += u64::from(stats.incomplete); + metrics.total_complete += u64::from(stats.complete); + metrics.total_downloaded += u64::from(stats.downloaded); } assert_eq!(repo.get_metrics().await, metrics); @@ -449,12 +449,12 @@ async fn it_should_import_persistent_torrents( ) { make(&repo, &entries).await; - let mut downloaded = repo.get_metrics().await.downloaded; + let mut downloaded = repo.get_metrics().await.total_downloaded; persistent_torrents.iter().for_each(|(_, d)| downloaded += u64::from(*d)); repo.import_persistent(&persistent_torrents).await; - assert_eq!(repo.get_metrics().await.downloaded, downloaded); + assert_eq!(repo.get_metrics().await.total_downloaded, downloaded); for (entry, _) in persistent_torrents { assert!(repo.get(&entry).await.is_some()); @@ -497,7 +497,7 @@ async fn it_should_remove_an_entry( assert_eq!(repo.remove(&info_hash).await, None); } - assert_eq!(repo.get_metrics().await.torrents, 0); + assert_eq!(repo.get_metrics().await.total_torrents, 0); } #[rstest] @@ -563,7 +563,7 @@ async fn it_should_remove_inactive_peers( // and verify there is an extra torrent entry. { repo.upsert_peer(&info_hash, &peer, None).await; - assert_eq!(repo.get_metrics().await.torrents, entries.len() as u64 + 1); + assert_eq!(repo.get_metrics().await.total_torrents, entries.len() as u64 + 1); } // Insert the infohash and peer into the repository diff --git a/packages/tracker-core/src/torrent/repository/in_memory.rs b/packages/tracker-core/src/torrent/repository/in_memory.rs index c3852654c..e09bede8e 100644 --- a/packages/tracker-core/src/torrent/repository/in_memory.rs +++ b/packages/tracker-core/src/torrent/repository/in_memory.rs @@ -5,8 +5,7 @@ use std::sync::Arc; use bittorrent_primitives::info_hash::InfoHash; use torrust_tracker_configuration::{TrackerPolicy, TORRENT_PEERS_LIMIT}; use torrust_tracker_primitives::pagination::Pagination; -use torrust_tracker_primitives::swarm_metadata::SwarmMetadata; -use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; +use torrust_tracker_primitives::swarm_metadata::{AggregateSwarmMetadata, SwarmMetadata}; use torrust_tracker_primitives::{peer, DurationSinceUnixEpoch, PersistentTorrent, PersistentTorrents}; use torrust_tracker_torrent_repository::entry::EntrySync; use torrust_tracker_torrent_repository::repository::Repository; @@ -208,7 +207,7 @@ impl InMemoryTorrentRepository { /// /// A [`TorrentsMetrics`] struct with the aggregated metrics. #[must_use] - pub fn get_torrents_metrics(&self) -> TorrentsMetrics { + pub fn get_torrents_metrics(&self) -> AggregateSwarmMetadata { self.torrents.get_metrics() } @@ -706,12 +705,12 @@ mod tests { } } - mod returning_torrent_metrics { + mod returning_aggregate_swarm_metadata { use std::sync::Arc; use bittorrent_primitives::info_hash::fixture::gen_seeded_infohash; - use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; + use torrust_tracker_primitives::swarm_metadata::AggregateSwarmMetadata; use crate::test_helpers::tests::{complete_peer, leecher, sample_info_hash, seeder}; use crate::torrent::repository::in_memory::InMemoryTorrentRepository; @@ -719,84 +718,84 @@ mod tests { // todo: refactor to use test parametrization #[tokio::test] - async fn it_should_get_empty_torrent_metrics_when_there_are_no_torrents() { + async fn it_should_get_empty_aggregate_swarm_metadata_when_there_are_no_torrents() { let in_memory_torrent_repository = Arc::new(InMemoryTorrentRepository::default()); - let torrents_metrics = in_memory_torrent_repository.get_torrents_metrics(); + let aggregate_swarm_metadata = in_memory_torrent_repository.get_torrents_metrics(); assert_eq!( - torrents_metrics, - TorrentsMetrics { - complete: 0, - downloaded: 0, - incomplete: 0, - torrents: 0 + aggregate_swarm_metadata, + AggregateSwarmMetadata { + total_complete: 0, + total_downloaded: 0, + total_incomplete: 0, + total_torrents: 0 } ); } #[tokio::test] - async fn it_should_return_the_torrent_metrics_when_there_is_a_leecher() { + async fn it_should_return_the_aggregate_swarm_metadata_when_there_is_a_leecher() { let in_memory_torrent_repository = Arc::new(InMemoryTorrentRepository::default()); let _number_of_downloads_increased = in_memory_torrent_repository.upsert_peer(&sample_info_hash(), &leecher(), None); - let torrent_metrics = in_memory_torrent_repository.get_torrents_metrics(); + let aggregate_swarm_metadata = in_memory_torrent_repository.get_torrents_metrics(); assert_eq!( - torrent_metrics, - TorrentsMetrics { - complete: 0, - downloaded: 0, - incomplete: 1, - torrents: 1, + aggregate_swarm_metadata, + AggregateSwarmMetadata { + total_complete: 0, + total_downloaded: 0, + total_incomplete: 1, + total_torrents: 1, } ); } #[tokio::test] - async fn it_should_return_the_torrent_metrics_when_there_is_a_seeder() { + async fn it_should_return_the_aggregate_swarm_metadata_when_there_is_a_seeder() { let in_memory_torrent_repository = Arc::new(InMemoryTorrentRepository::default()); let _number_of_downloads_increased = in_memory_torrent_repository.upsert_peer(&sample_info_hash(), &seeder(), None); - let torrent_metrics = in_memory_torrent_repository.get_torrents_metrics(); + let aggregate_swarm_metadata = in_memory_torrent_repository.get_torrents_metrics(); assert_eq!( - torrent_metrics, - TorrentsMetrics { - complete: 1, - downloaded: 0, - incomplete: 0, - torrents: 1, + aggregate_swarm_metadata, + AggregateSwarmMetadata { + total_complete: 1, + total_downloaded: 0, + total_incomplete: 0, + total_torrents: 1, } ); } #[tokio::test] - async fn it_should_return_the_torrent_metrics_when_there_is_a_completed_peer() { + async fn it_should_return_the_aggregate_swarm_metadata_when_there_is_a_completed_peer() { let in_memory_torrent_repository = Arc::new(InMemoryTorrentRepository::default()); let _number_of_downloads_increased = in_memory_torrent_repository.upsert_peer(&sample_info_hash(), &complete_peer(), None); - let torrent_metrics = in_memory_torrent_repository.get_torrents_metrics(); + let aggregate_swarm_metadata = in_memory_torrent_repository.get_torrents_metrics(); assert_eq!( - torrent_metrics, - TorrentsMetrics { - complete: 1, - downloaded: 0, - incomplete: 0, - torrents: 1, + aggregate_swarm_metadata, + AggregateSwarmMetadata { + total_complete: 1, + total_downloaded: 0, + total_incomplete: 0, + total_torrents: 1, } ); } #[tokio::test] - async fn it_should_return_the_torrent_metrics_when_there_are_multiple_torrents() { + async fn it_should_return_the_aggregate_swarm_metadata_when_there_are_multiple_torrents() { let in_memory_torrent_repository = Arc::new(InMemoryTorrentRepository::default()); let start_time = std::time::Instant::now(); @@ -807,16 +806,16 @@ mod tests { let result_a = start_time.elapsed(); let start_time = std::time::Instant::now(); - let torrent_metrics = in_memory_torrent_repository.get_torrents_metrics(); + let aggregate_swarm_metadata = in_memory_torrent_repository.get_torrents_metrics(); let result_b = start_time.elapsed(); assert_eq!( - (torrent_metrics), - (TorrentsMetrics { - complete: 0, - downloaded: 0, - incomplete: 1_000_000, - torrents: 1_000_000, + (aggregate_swarm_metadata), + (AggregateSwarmMetadata { + total_complete: 0, + total_downloaded: 0, + total_incomplete: 1_000_000, + total_torrents: 1_000_000, }), "{result_a:?} {result_b:?}" ); diff --git a/packages/udp-tracker-core/src/statistics/services.rs b/packages/udp-tracker-core/src/statistics/services.rs index 7ffa127e6..56814f5d5 100644 --- a/packages/udp-tracker-core/src/statistics/services.rs +++ b/packages/udp-tracker-core/src/statistics/services.rs @@ -39,7 +39,7 @@ use std::sync::Arc; use bittorrent_tracker_core::torrent::repository::in_memory::InMemoryTorrentRepository; -use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; +use torrust_tracker_primitives::swarm_metadata::AggregateSwarmMetadata; use crate::statistics::metrics::Metrics; use crate::statistics::repository::Repository; @@ -50,7 +50,7 @@ pub struct TrackerMetrics { /// Domain level metrics. /// /// General metrics for all torrents (number of seeders, leechers, etcetera) - pub torrents_metrics: TorrentsMetrics, + pub torrents_metrics: AggregateSwarmMetadata, /// Application level metrics. Usage statistics/metrics. /// @@ -88,7 +88,7 @@ mod tests { use bittorrent_tracker_core::torrent::repository::in_memory::InMemoryTorrentRepository; use bittorrent_tracker_core::{self}; use torrust_tracker_configuration::Configuration; - use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; + use torrust_tracker_primitives::swarm_metadata::AggregateSwarmMetadata; use torrust_tracker_test_helpers::configuration; use crate::statistics; @@ -113,7 +113,7 @@ mod tests { assert_eq!( tracker_metrics, TrackerMetrics { - torrents_metrics: TorrentsMetrics::default(), + torrents_metrics: AggregateSwarmMetadata::default(), protocol_metrics: statistics::metrics::Metrics::default(), } ); diff --git a/packages/udp-tracker-server/src/statistics/services.rs b/packages/udp-tracker-server/src/statistics/services.rs index 92ee14f50..a16685077 100644 --- a/packages/udp-tracker-server/src/statistics/services.rs +++ b/packages/udp-tracker-server/src/statistics/services.rs @@ -41,7 +41,7 @@ use std::sync::Arc; use bittorrent_tracker_core::torrent::repository::in_memory::InMemoryTorrentRepository; use bittorrent_udp_tracker_core::services::banning::BanService; use tokio::sync::RwLock; -use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; +use torrust_tracker_primitives::swarm_metadata::AggregateSwarmMetadata; use crate::statistics::metrics::Metrics; use crate::statistics::repository::Repository; @@ -52,7 +52,7 @@ pub struct TrackerMetrics { /// Domain level metrics. /// /// General metrics for all torrents (number of seeders, leechers, etcetera) - pub torrents_metrics: TorrentsMetrics, + pub torrents_metrics: AggregateSwarmMetadata, /// Application level metrics. Usage statistics/metrics. /// @@ -108,7 +108,7 @@ mod tests { use bittorrent_udp_tracker_core::MAX_CONNECTION_ID_ERRORS_PER_IP; use tokio::sync::RwLock; use torrust_tracker_configuration::Configuration; - use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics; + use torrust_tracker_primitives::swarm_metadata::AggregateSwarmMetadata; use torrust_tracker_test_helpers::configuration; use crate::statistics; @@ -139,7 +139,7 @@ mod tests { assert_eq!( tracker_metrics, TrackerMetrics { - torrents_metrics: TorrentsMetrics::default(), + torrents_metrics: AggregateSwarmMetadata::default(), protocol_metrics: statistics::metrics::Metrics::default(), } );