Skip to content

Commit 58a57d3

Browse files
josecelanoda2ce7
authored andcommitted
refactor: extract struct SwarmStats
(da2ce7): Merge `SwarmStats` into `SwarmMetadata`.
1 parent d4adfa7 commit 58a57d3

File tree

7 files changed

+75
-74
lines changed

7 files changed

+75
-74
lines changed

packages/configuration/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ pub struct HealthCheckApi {
388388
}
389389

390390
/// Announce policy
391-
#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone, Copy)]
391+
#[derive(PartialEq, Eq, Debug, Clone, Copy)]
392392
pub struct AnnouncePolicy {
393393
/// Interval in seconds that the client should wait between sending regular
394394
/// announce requests to the tracker.

src/core/mod.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -732,7 +732,7 @@ impl Tracker {
732732
let (stats, stats_updated) = self.torrents.update_torrent_with_peer_and_get_stats(info_hash, peer).await;
733733

734734
if self.config.persistent_torrent_completed_stat && stats_updated {
735-
let completed = stats.completed;
735+
let completed = stats.downloaded;
736736
let info_hash = *info_hash;
737737

738738
drop(self.database.save_persistent_torrent(&info_hash, completed).await);
@@ -1390,7 +1390,7 @@ mod tests {
13901390

13911391
let announce_data = tracker.announce(&sample_info_hash(), &mut peer, &peer_ip()).await;
13921392

1393-
assert_eq!(announce_data.swarm_stats.seeders, 1);
1393+
assert_eq!(announce_data.swarm_stats.complete, 1);
13941394
}
13951395

13961396
#[tokio::test]
@@ -1401,7 +1401,7 @@ mod tests {
14011401

14021402
let announce_data = tracker.announce(&sample_info_hash(), &mut peer, &peer_ip()).await;
14031403

1404-
assert_eq!(announce_data.swarm_stats.leechers, 1);
1404+
assert_eq!(announce_data.swarm_stats.incomplete, 1);
14051405
}
14061406

14071407
#[tokio::test]
@@ -1415,7 +1415,7 @@ mod tests {
14151415
let mut completed_peer = completed_peer();
14161416
let announce_data = tracker.announce(&sample_info_hash(), &mut completed_peer, &peer_ip()).await;
14171417

1418-
assert_eq!(announce_data.swarm_stats.completed, 1);
1418+
assert_eq!(announce_data.swarm_stats.downloaded, 1);
14191419
}
14201420
}
14211421
}
@@ -1739,11 +1739,11 @@ mod tests {
17391739

17401740
peer.event = AnnounceEvent::Started;
17411741
let swarm_stats = tracker.update_torrent_with_peer_and_get_stats(&info_hash, &peer).await;
1742-
assert_eq!(swarm_stats.completed, 0);
1742+
assert_eq!(swarm_stats.downloaded, 0);
17431743

17441744
peer.event = AnnounceEvent::Completed;
17451745
let swarm_stats = tracker.update_torrent_with_peer_and_get_stats(&info_hash, &peer).await;
1746-
assert_eq!(swarm_stats.completed, 1);
1746+
assert_eq!(swarm_stats.downloaded, 1);
17471747

17481748
// Remove the newly updated torrent from memory
17491749
tracker.torrents.get_torrents_mut().await.remove(&info_hash);

src/core/torrent/mod.rs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -73,18 +73,8 @@ impl SwarmMetadata {
7373
}
7474
}
7575

76-
/// Swarm statistics for one torrent.
77-
///
78-
/// See [BEP 48: Tracker Protocol Extension: Scrape](https://www.bittorrent.org/beps/bep_0048.html)
79-
#[derive(Debug, PartialEq, Default)]
80-
pub struct SwarmStats {
81-
/// The number of peers that have ever completed downloading
82-
pub completed: u32,
83-
/// The number of active peers that have completed downloading (seeders)
84-
pub seeders: u32,
85-
/// The number of active peers that have not completed downloading (leechers)
86-
pub leechers: u32,
87-
}
76+
/// [`SwarmStats`] has the same form as [`SwarmMetadata`]
77+
pub type SwarmStats = SwarmMetadata;
8878

8979
impl Entry {
9080
#[must_use]

src/core/torrent/repository.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,9 @@ impl Repository for Sync {
7777

7878
(
7979
SwarmStats {
80-
completed: stats.1,
81-
seeders: stats.0,
82-
leechers: stats.2,
80+
downloaded: stats.1,
81+
complete: stats.0,
82+
incomplete: stats.2,
8383
},
8484
stats_updated,
8585
)
@@ -131,9 +131,9 @@ impl Repository for SyncSingle {
131131

132132
(
133133
SwarmStats {
134-
completed: stats.1,
135-
seeders: stats.0,
136-
leechers: stats.2,
134+
downloaded: stats.1,
135+
complete: stats.0,
136+
incomplete: stats.2,
137137
},
138138
stats_updated,
139139
)
@@ -176,9 +176,9 @@ impl TRepositoryAsync for RepositoryAsync {
176176

177177
(
178178
SwarmStats {
179-
completed: stats.1,
180-
seeders: stats.0,
181-
leechers: stats.2,
179+
downloaded: stats.1,
180+
complete: stats.0,
181+
incomplete: stats.2,
182182
},
183183
stats_updated,
184184
)
@@ -234,9 +234,9 @@ impl TRepositoryAsync for AsyncSync {
234234

235235
(
236236
SwarmStats {
237-
completed: stats.1,
238-
seeders: stats.0,
239-
leechers: stats.2,
237+
downloaded: stats.1,
238+
complete: stats.0,
239+
incomplete: stats.2,
240240
},
241241
stats_updated,
242242
)
@@ -281,9 +281,9 @@ impl TRepositoryAsync for RepositoryAsyncSingle {
281281

282282
(
283283
SwarmStats {
284-
completed: stats.1,
285-
seeders: stats.0,
286-
leechers: stats.2,
284+
downloaded: stats.1,
285+
complete: stats.0,
286+
incomplete: stats.2,
287287
},
288288
stats_updated,
289289
)

src/servers/http/v1/responses/announce.rs

Lines changed: 44 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ use std::panic::Location;
77

88
use axum::http::StatusCode;
99
use axum::response::{IntoResponse, Response};
10-
use serde::{self, Deserialize, Serialize};
1110
use thiserror::Error;
1211
use torrust_tracker_configuration::AnnouncePolicy;
1312
use torrust_tracker_contrib_bencode::{ben_bytes, ben_int, ben_list, ben_map, BMutAccess, BencodeMut};
1413

14+
use crate::core::torrent::SwarmStats;
1515
use crate::core::{self, AnnounceData};
1616
use crate::servers::http::v1::responses;
1717

@@ -22,15 +22,19 @@ use crate::servers::http::v1::responses;
2222
/// ```rust
2323
/// use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
2424
/// use torrust_tracker_configuration::AnnouncePolicy;
25+
/// use torrust_tracker::core::torrent::SwarmStats;
2526
/// use torrust_tracker::servers::http::v1::responses::announce::{Normal, NormalPeer};
2627
///
2728
/// let response = Normal {
2829
/// policy: AnnouncePolicy {
2930
/// interval: 111,
3031
/// interval_min: 222,
3132
/// },
32-
/// complete: 333,
33-
/// incomplete: 444,
33+
/// stats: SwarmStats {
34+
/// downloaded: 0,
35+
/// complete: 333,
36+
/// incomplete: 444,
37+
/// },
3438
/// peers: vec![
3539
/// // IPV4
3640
/// NormalPeer {
@@ -60,15 +64,10 @@ use crate::servers::http::v1::responses;
6064
///
6165
/// Refer to [BEP 03: The `BitTorrent` Protocol Specification](https://www.bittorrent.org/beps/bep_0003.html)
6266
/// for more information.
63-
#[derive(Serialize, Deserialize, Debug, PartialEq)]
67+
#[derive(Debug, PartialEq)]
6468
pub struct Normal {
65-
/// Announce policy
6669
pub policy: AnnouncePolicy,
67-
/// Number of peers with the entire file, i.e. seeders.
68-
pub complete: u32,
69-
/// Number of non-seeder peers, aka "leechers".
70-
pub incomplete: u32,
71-
/// A list of peers. The value is a list of dictionaries.
70+
pub stats: SwarmStats,
7271
pub peers: Vec<NormalPeer>,
7372
}
7473

@@ -85,7 +84,7 @@ pub struct Normal {
8584
/// port: 0x7070, // 28784
8685
/// };
8786
/// ```
88-
#[derive(Serialize, Deserialize, Debug, PartialEq)]
87+
#[derive(Debug, PartialEq)]
8988
pub struct NormalPeer {
9089
/// The peer's ID.
9190
pub peer_id: [u8; 20],
@@ -131,8 +130,8 @@ impl Normal {
131130
}
132131

133132
(ben_map! {
134-
"complete" => ben_int!(i64::from(self.complete)),
135-
"incomplete" => ben_int!(i64::from(self.incomplete)),
133+
"complete" => ben_int!(i64::from(self.stats.complete)),
134+
"incomplete" => ben_int!(i64::from(self.stats.incomplete)),
136135
"interval" => ben_int!(i64::from(self.policy.interval)),
137136
"min interval" => ben_int!(i64::from(self.policy.interval_min)),
138137
"peers" => peers_list.clone()
@@ -160,8 +159,11 @@ impl From<AnnounceData> for Normal {
160159
interval: domain_announce_response.interval,
161160
interval_min: domain_announce_response.interval_min,
162161
},
163-
complete: domain_announce_response.swarm_stats.seeders,
164-
incomplete: domain_announce_response.swarm_stats.leechers,
162+
stats: SwarmStats {
163+
complete: domain_announce_response.swarm_stats.complete,
164+
incomplete: domain_announce_response.swarm_stats.incomplete,
165+
downloaded: 0,
166+
},
165167
peers,
166168
}
167169
}
@@ -176,15 +178,19 @@ impl From<AnnounceData> for Normal {
176178
/// ```rust
177179
/// use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
178180
/// use torrust_tracker_configuration::AnnouncePolicy;
181+
/// use torrust_tracker::core::torrent::SwarmStats;
179182
/// use torrust_tracker::servers::http::v1::responses::announce::{Compact, CompactPeer};
180183
///
181184
/// let response = Compact {
182185
/// policy: AnnouncePolicy {
183186
/// interval: 111,
184187
/// interval_min: 222,
185188
/// },
186-
/// complete: 333,
187-
/// incomplete: 444,
189+
/// stats: SwarmStats {
190+
/// downloaded: 0,
191+
/// complete: 333,
192+
/// incomplete: 444,
193+
/// },
188194
/// peers: vec![
189195
/// // IPV4
190196
/// CompactPeer {
@@ -216,15 +222,10 @@ impl From<AnnounceData> for Normal {
216222
///
217223
/// - [BEP 23: Tracker Returns Compact Peer Lists](https://www.bittorrent.org/beps/bep_0023.html)
218224
/// - [BEP 07: IPv6 Tracker Extension](https://www.bittorrent.org/beps/bep_0007.html)
219-
#[derive(Serialize, Deserialize, Debug, PartialEq)]
225+
#[derive(Debug, PartialEq)]
220226
pub struct Compact {
221-
/// Announce policy
222227
pub policy: AnnouncePolicy,
223-
/// Number of seeders, aka "completed".
224-
pub complete: u32,
225-
/// Number of non-seeder peers, aka "incomplete".
226-
pub incomplete: u32,
227-
/// Compact peer list.
228+
pub stats: SwarmStats,
228229
pub peers: Vec<CompactPeer>,
229230
}
230231

@@ -250,7 +251,7 @@ pub struct Compact {
250251
///
251252
/// Refer to [BEP 23: Tracker Returns Compact Peer Lists](https://www.bittorrent.org/beps/bep_0023.html)
252253
/// for more information.
253-
#[derive(Serialize, Deserialize, Debug, PartialEq)]
254+
#[derive(Debug, PartialEq)]
254255
pub struct CompactPeer {
255256
/// The peer's IP address.
256257
pub ip: IpAddr,
@@ -296,8 +297,8 @@ impl Compact {
296297
/// Will return `Err` if internally interrupted.
297298
pub fn body(&self) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
298299
let bytes = (ben_map! {
299-
"complete" => ben_int!(i64::from(self.complete)),
300-
"incomplete" => ben_int!(i64::from(self.incomplete)),
300+
"complete" => ben_int!(i64::from(self.stats.complete)),
301+
"incomplete" => ben_int!(i64::from(self.stats.incomplete)),
301302
"interval" => ben_int!(i64::from(self.policy.interval)),
302303
"min interval" => ben_int!(i64::from(self.policy.interval_min)),
303304
"peers" => ben_bytes!(self.peers_v4_bytes()?),
@@ -381,8 +382,11 @@ impl From<AnnounceData> for Compact {
381382
interval: domain_announce_response.interval,
382383
interval_min: domain_announce_response.interval_min,
383384
},
384-
complete: domain_announce_response.swarm_stats.seeders,
385-
incomplete: domain_announce_response.swarm_stats.leechers,
385+
stats: SwarmStats {
386+
complete: domain_announce_response.swarm_stats.complete,
387+
incomplete: domain_announce_response.swarm_stats.incomplete,
388+
downloaded: 0,
389+
},
386390
peers,
387391
}
388392
}
@@ -396,6 +400,7 @@ mod tests {
396400
use torrust_tracker_configuration::AnnouncePolicy;
397401

398402
use super::{Normal, NormalPeer};
403+
use crate::core::torrent::SwarmStats;
399404
use crate::servers::http::v1::responses::announce::{Compact, CompactPeer};
400405

401406
// Some ascii values used in tests:
@@ -417,8 +422,11 @@ mod tests {
417422
interval: 111,
418423
interval_min: 222,
419424
},
420-
complete: 333,
421-
incomplete: 444,
425+
stats: SwarmStats {
426+
downloaded: 0,
427+
complete: 333,
428+
incomplete: 444,
429+
},
422430
peers: vec![
423431
// IPV4
424432
NormalPeer {
@@ -453,8 +461,11 @@ mod tests {
453461
interval: 111,
454462
interval_min: 222,
455463
},
456-
complete: 333,
457-
incomplete: 444,
464+
stats: SwarmStats {
465+
downloaded: 0,
466+
complete: 333,
467+
incomplete: 444,
468+
},
458469
peers: vec![
459470
// IPV4
460471
CompactPeer {

src/servers/http/v1/services/announce.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,9 @@ mod tests {
114114
let expected_announce_data = AnnounceData {
115115
peers: vec![],
116116
swarm_stats: SwarmStats {
117-
completed: 0,
118-
seeders: 1,
119-
leechers: 0,
117+
downloaded: 0,
118+
complete: 1,
119+
incomplete: 0,
120120
},
121121
interval: tracker.config.announce_interval,
122122
interval_min: tracker.config.min_announce_interval,

src/servers/udp/handlers.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,8 @@ pub async fn handle_announce(
152152
let announce_response = AnnounceResponse {
153153
transaction_id: wrapped_announce_request.announce_request.transaction_id,
154154
announce_interval: AnnounceInterval(i64::from(tracker.config.announce_interval) as i32),
155-
leechers: NumberOfPeers(i64::from(response.swarm_stats.leechers) as i32),
156-
seeders: NumberOfPeers(i64::from(response.swarm_stats.seeders) as i32),
155+
leechers: NumberOfPeers(i64::from(response.swarm_stats.incomplete) as i32),
156+
seeders: NumberOfPeers(i64::from(response.swarm_stats.complete) as i32),
157157
peers: response
158158
.peers
159159
.iter()
@@ -177,8 +177,8 @@ pub async fn handle_announce(
177177
let announce_response = AnnounceResponse {
178178
transaction_id: wrapped_announce_request.announce_request.transaction_id,
179179
announce_interval: AnnounceInterval(i64::from(tracker.config.announce_interval) as i32),
180-
leechers: NumberOfPeers(i64::from(response.swarm_stats.leechers) as i32),
181-
seeders: NumberOfPeers(i64::from(response.swarm_stats.seeders) as i32),
180+
leechers: NumberOfPeers(i64::from(response.swarm_stats.incomplete) as i32),
181+
seeders: NumberOfPeers(i64::from(response.swarm_stats.complete) as i32),
182182
peers: response
183183
.peers
184184
.iter()

0 commit comments

Comments
 (0)