Skip to content

Commit 03e88d0

Browse files
committed
dev: use aquatic number_of_bytes
1 parent 00af70f commit 03e88d0

File tree

22 files changed

+147
-127
lines changed

22 files changed

+147
-127
lines changed

Cargo.lock

+2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/primitives/src/lib.rs

+14-8
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
use std::collections::BTreeMap;
88
use std::time::Duration;
99

10-
pub use aquatic_udp_protocol::{AnnounceEvent, AnnounceEventBytes};
10+
use aquatic_udp_protocol::{AnnounceEvent, NumberOfBytes};
1111
use info_hash::InfoHash;
12-
use serde::{Deserialize, Serialize};
12+
use serde::Serialize;
1313

1414
pub mod info_hash;
1515
pub mod pagination;
@@ -37,10 +37,11 @@ pub enum AnnounceEventSer {
3737
None,
3838
}
3939

40-
/// Serializes a `DurationSinceUnixEpoch` as a Unix timestamp in milliseconds.
40+
/// Serializes a `Announce Event` as a enum.
41+
///
4142
/// # Errors
4243
///
43-
/// Will return `serde::Serializer::Error` if unable to serialize the `unix_time_value`.
44+
/// If will return an error if the internal serializer was to fail.
4445
pub fn ser_announce_event<S: serde::Serializer>(announce_event: &AnnounceEvent, ser: S) -> Result<S::Ok, S::Error> {
4546
let event_ser = match announce_event {
4647
AnnounceEvent::Started => AnnounceEventSer::Started,
@@ -52,6 +53,15 @@ pub fn ser_announce_event<S: serde::Serializer>(announce_event: &AnnounceEvent,
5253
ser.serialize_some(&event_ser)
5354
}
5455

56+
/// Serializes a `Announce Event` as a i64.
57+
///
58+
/// # Errors
59+
///
60+
/// If will return an error if the internal serializer was to fail.
61+
pub fn ser_number_of_bytes<S: serde::Serializer>(number_of_bytes: &NumberOfBytes, ser: S) -> Result<S::Ok, S::Error> {
62+
ser.serialize_i64(number_of_bytes.0.get())
63+
}
64+
5565
/// IP version used by the peer to connect to the tracker: IPv4 or IPv6
5666
#[derive(PartialEq, Eq, Debug)]
5767
pub enum IPVersion {
@@ -61,8 +71,4 @@ pub enum IPVersion {
6171
IPv6,
6272
}
6373

64-
/// Number of bytes downloaded, uploaded or pending to download (left) by the peer.
65-
#[derive(Hash, Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
66-
pub struct NumberOfBytes(pub i64);
67-
6874
pub type PersistentTorrents = BTreeMap<InfoHash, u32>;

packages/primitives/src/peer.rs

+27-24
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,20 @@
1414
//! peer_id: peer::Id(*b"-qB00000000000000000"),
1515
//! peer_addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(126, 0, 0, 1)), 8080),
1616
//! updated: DurationSinceUnixEpoch::new(1_669_397_478_934, 0),
17-
//! uploaded: NumberOfBytes(0),
18-
//! downloaded: NumberOfBytes(0),
19-
//! left: NumberOfBytes(0),
17+
//! uploaded: NumberOfBytes::new(0),
18+
//! downloaded: NumberOfBytes::new(0),
19+
//! left: NumberOfBytes::new(0),
2020
//! event: AnnounceEvent::Started,
2121
//! };
2222
//! ```
2323
2424
use std::net::{IpAddr, SocketAddr};
2525
use std::sync::Arc;
2626

27-
use aquatic_udp_protocol::AnnounceEvent;
27+
use aquatic_udp_protocol::{AnnounceEvent, NumberOfBytes};
2828
use serde::Serialize;
2929

30-
use crate::{ser_announce_event, ser_unix_time_value, DurationSinceUnixEpoch, IPVersion, NumberOfBytes};
30+
use crate::{ser_announce_event, ser_number_of_bytes, ser_unix_time_value, DurationSinceUnixEpoch, IPVersion};
3131

3232
/// Peer struct used by the core `Tracker`.
3333
///
@@ -45,9 +45,9 @@ use crate::{ser_announce_event, ser_unix_time_value, DurationSinceUnixEpoch, IPV
4545
/// peer_id: peer::Id(*b"-qB00000000000000000"),
4646
/// peer_addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(126, 0, 0, 1)), 8080),
4747
/// updated: DurationSinceUnixEpoch::new(1_669_397_478_934, 0),
48-
/// uploaded: NumberOfBytes(0),
49-
/// downloaded: NumberOfBytes(0),
50-
/// left: NumberOfBytes(0),
48+
/// uploaded: NumberOfBytes::new(0),
49+
/// downloaded: NumberOfBytes::new(0),
50+
/// left: NumberOfBytes::new(0),
5151
/// event: AnnounceEvent::Started,
5252
/// };
5353
/// ```
@@ -61,10 +61,13 @@ pub struct Peer {
6161
#[serde(serialize_with = "ser_unix_time_value")]
6262
pub updated: DurationSinceUnixEpoch,
6363
/// The total amount of bytes uploaded by this peer so far
64+
#[serde(serialize_with = "ser_number_of_bytes")]
6465
pub uploaded: NumberOfBytes,
6566
/// The total amount of bytes downloaded by this peer so far
67+
#[serde(serialize_with = "ser_number_of_bytes")]
6668
pub downloaded: NumberOfBytes,
6769
/// The number of bytes this peer still has to download
70+
#[serde(serialize_with = "ser_number_of_bytes")]
6871
pub left: NumberOfBytes,
6972
/// This is an optional key which maps to started, completed, or stopped (or empty, which is the same as not being present).
7073
#[serde(serialize_with = "ser_announce_event")]
@@ -93,7 +96,7 @@ pub trait ReadInfo {
9396

9497
impl ReadInfo for Peer {
9598
fn is_seeder(&self) -> bool {
96-
self.left.0 <= 0 && self.event != AnnounceEvent::Stopped
99+
self.left.0.get() <= 0 && self.event != AnnounceEvent::Stopped
97100
}
98101

99102
fn get_event(&self) -> AnnounceEvent {
@@ -115,7 +118,7 @@ impl ReadInfo for Peer {
115118

116119
impl ReadInfo for Arc<Peer> {
117120
fn is_seeder(&self) -> bool {
118-
self.left.0 <= 0 && self.event != AnnounceEvent::Stopped
121+
self.left.0.get() <= 0 && self.event != AnnounceEvent::Stopped
119122
}
120123

121124
fn get_event(&self) -> AnnounceEvent {
@@ -138,7 +141,7 @@ impl ReadInfo for Arc<Peer> {
138141
impl Peer {
139142
#[must_use]
140143
pub fn is_seeder(&self) -> bool {
141-
self.left.0 <= 0 && self.event != AnnounceEvent::Stopped
144+
self.left.0.get() <= 0 && self.event != AnnounceEvent::Stopped
142145
}
143146

144147
pub fn ip(&mut self) -> IpAddr {
@@ -357,10 +360,10 @@ impl<P: Encoding> FromIterator<Peer> for Vec<P> {
357360
pub mod fixture {
358361
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
359362

360-
use aquatic_udp_protocol::AnnounceEvent;
363+
use aquatic_udp_protocol::{AnnounceEvent, NumberOfBytes};
361364

362365
use super::{Id, Peer};
363-
use crate::{DurationSinceUnixEpoch, NumberOfBytes};
366+
use crate::DurationSinceUnixEpoch;
364367

365368
#[derive(PartialEq, Debug)]
366369

@@ -383,9 +386,9 @@ pub mod fixture {
383386
peer_id: Id(*b"-qB00000000000000001"),
384387
peer_addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080),
385388
updated: DurationSinceUnixEpoch::new(1_669_397_478_934, 0),
386-
uploaded: NumberOfBytes(0),
387-
downloaded: NumberOfBytes(0),
388-
left: NumberOfBytes(0),
389+
uploaded: NumberOfBytes::new(0),
390+
downloaded: NumberOfBytes::new(0),
391+
left: NumberOfBytes::new(0),
389392
event: AnnounceEvent::Completed,
390393
};
391394

@@ -399,9 +402,9 @@ pub mod fixture {
399402
peer_id: Id(*b"-qB00000000000000002"),
400403
peer_addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 2)), 8080),
401404
updated: DurationSinceUnixEpoch::new(1_669_397_478_934, 0),
402-
uploaded: NumberOfBytes(0),
403-
downloaded: NumberOfBytes(0),
404-
left: NumberOfBytes(10),
405+
uploaded: NumberOfBytes::new(0),
406+
downloaded: NumberOfBytes::new(0),
407+
left: NumberOfBytes::new(10),
405408
event: AnnounceEvent::Started,
406409
};
407410

@@ -425,14 +428,14 @@ pub mod fixture {
425428
#[allow(dead_code)]
426429
#[must_use]
427430
pub fn with_bytes_pending_to_download(mut self, left: i64) -> Self {
428-
self.peer.left = NumberOfBytes(left);
431+
self.peer.left = NumberOfBytes::new(left);
429432
self
430433
}
431434

432435
#[allow(dead_code)]
433436
#[must_use]
434437
pub fn with_no_bytes_pending_to_download(mut self) -> Self {
435-
self.peer.left = NumberOfBytes(0);
438+
self.peer.left = NumberOfBytes::new(0);
436439
self
437440
}
438441

@@ -462,9 +465,9 @@ pub mod fixture {
462465
peer_id: Id::default(),
463466
peer_addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080),
464467
updated: DurationSinceUnixEpoch::new(1_669_397_478_934, 0),
465-
uploaded: NumberOfBytes(0),
466-
downloaded: NumberOfBytes(0),
467-
left: NumberOfBytes(0),
468+
uploaded: NumberOfBytes::new(0),
469+
downloaded: NumberOfBytes::new(0),
470+
left: NumberOfBytes::new(0),
468471
event: AnnounceEvent::Started,
469472
}
470473
}

packages/torrent-repository/Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ rust-version.workspace = true
1616
version.workspace = true
1717

1818
[dependencies]
19+
aquatic_udp_protocol = "0"
1920
crossbeam-skiplist = "0"
2021
dashmap = "6"
2122
futures = "0"
@@ -24,6 +25,7 @@ tokio = { version = "1", features = ["macros", "net", "rt-multi-thread", "signal
2425
torrust-tracker-clock = { version = "3.0.0-beta-develop", path = "../clock" }
2526
torrust-tracker-configuration = { version = "3.0.0-beta-develop", path = "../configuration" }
2627
torrust-tracker-primitives = { version = "3.0.0-beta-develop", path = "../primitives" }
28+
zerocopy = "0"
2729

2830
[dev-dependencies]
2931
async-std = { version = "1", features = ["attributes", "tokio1"] }

packages/torrent-repository/benches/helpers/utils.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
use std::collections::HashSet;
22
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
33

4+
use aquatic_udp_protocol::{AnnounceEvent, NumberOfBytes};
45
use torrust_tracker_primitives::info_hash::InfoHash;
56
use torrust_tracker_primitives::peer::{Id, Peer};
6-
use torrust_tracker_primitives::{AnnounceEvent, DurationSinceUnixEpoch, NumberOfBytes};
7+
use torrust_tracker_primitives::DurationSinceUnixEpoch;
8+
use zerocopy::I64;
79

810
pub const DEFAULT_PEER: Peer = Peer {
911
peer_id: Id([0; 20]),
1012
peer_addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080),
1113
updated: DurationSinceUnixEpoch::from_secs(0),
12-
uploaded: NumberOfBytes(0),
13-
downloaded: NumberOfBytes(0),
14-
left: NumberOfBytes(0),
14+
uploaded: NumberOfBytes(I64::ZERO),
15+
downloaded: NumberOfBytes(I64::ZERO),
16+
left: NumberOfBytes(I64::ZERO),
1517
event: AnnounceEvent::Started,
1618
};
1719

packages/torrent-repository/src/entry/single.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
use std::net::SocketAddr;
22
use std::sync::Arc;
33

4+
use aquatic_udp_protocol::AnnounceEvent;
45
use torrust_tracker_configuration::TrackerPolicy;
56
use torrust_tracker_primitives::peer::{self};
67
use torrust_tracker_primitives::swarm_metadata::SwarmMetadata;
7-
use torrust_tracker_primitives::{AnnounceEvent, DurationSinceUnixEpoch};
8+
use torrust_tracker_primitives::DurationSinceUnixEpoch;
89

910
use super::Entry;
1011
use crate::EntrySingle;

packages/torrent-repository/tests/common/torrent_peer_builder.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use std::net::SocketAddr;
22

3+
use aquatic_udp_protocol::{AnnounceEvent, NumberOfBytes};
34
use torrust_tracker_clock::clock::Time;
4-
use torrust_tracker_primitives::{peer, AnnounceEvent, DurationSinceUnixEpoch, NumberOfBytes};
5+
use torrust_tracker_primitives::{peer, DurationSinceUnixEpoch};
56

67
use crate::CurrentClock;
78

@@ -48,7 +49,7 @@ impl TorrentPeerBuilder {
4849

4950
#[must_use]
5051
fn with_number_of_bytes_left(mut self, left: i64) -> Self {
51-
self.peer.left = NumberOfBytes(left);
52+
self.peer.left = NumberOfBytes::new(left);
5253
self
5354
}
5455

packages/torrent-repository/tests/entry/mod.rs

+8-7
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@ use std::net::{IpAddr, Ipv4Addr, SocketAddr};
22
use std::ops::Sub;
33
use std::time::Duration;
44

5+
use aquatic_udp_protocol::{AnnounceEvent, NumberOfBytes};
56
use rstest::{fixture, rstest};
67
use torrust_tracker_clock::clock::stopped::Stopped as _;
78
use torrust_tracker_clock::clock::{self, Time as _};
89
use torrust_tracker_configuration::{TrackerPolicy, TORRENT_PEERS_LIMIT};
10+
use torrust_tracker_primitives::peer;
911
use torrust_tracker_primitives::peer::Peer;
10-
use torrust_tracker_primitives::{peer, AnnounceEvent, NumberOfBytes};
1112
use torrust_tracker_torrent_repository::{
1213
EntryMutexParkingLot, EntryMutexStd, EntryMutexTokio, EntryRwLockParkingLot, EntrySingle,
1314
};
@@ -85,7 +86,7 @@ async fn make(torrent: &mut Torrent, makes: &Makes) -> Vec<Peer> {
8586
let mut peer = a_started_peer(3);
8687
torrent.upsert_peer(&peer).await;
8788
peer.event = AnnounceEvent::Completed;
88-
peer.left = NumberOfBytes(0);
89+
peer.left = NumberOfBytes::new(0);
8990
torrent.upsert_peer(&peer).await;
9091
vec![peer]
9192
}
@@ -99,7 +100,7 @@ async fn make(torrent: &mut Torrent, makes: &Makes) -> Vec<Peer> {
99100
let mut peer_3 = a_started_peer(3);
100101
torrent.upsert_peer(&peer_3).await;
101102
peer_3.event = AnnounceEvent::Completed;
102-
peer_3.left = NumberOfBytes(0);
103+
peer_3.left = NumberOfBytes::new(0);
103104
torrent.upsert_peer(&peer_3).await;
104105
vec![peer_1, peer_2, peer_3]
105106
}
@@ -304,10 +305,10 @@ async fn it_should_update_a_peer_as_a_seeder(
304305
let peers = torrent.get_peers(None).await;
305306
let mut peer = **peers.first().expect("there should be a peer");
306307

307-
let is_already_non_left = peer.left == NumberOfBytes(0);
308+
let is_already_non_left = peer.left == NumberOfBytes::new(0);
308309

309310
// Set Bytes Left to Zero
310-
peer.left = NumberOfBytes(0);
311+
peer.left = NumberOfBytes::new(0);
311312
torrent.upsert_peer(&peer).await;
312313
let stats = torrent.get_stats().await;
313314

@@ -336,10 +337,10 @@ async fn it_should_update_a_peer_as_incomplete(
336337
let peers = torrent.get_peers(None).await;
337338
let mut peer = **peers.first().expect("there should be a peer");
338339

339-
let completed_already = peer.left == NumberOfBytes(0);
340+
let completed_already = peer.left == NumberOfBytes::new(0);
340341

341342
// Set Bytes Left to no Zero
342-
peer.left = NumberOfBytes(1);
343+
peer.left = NumberOfBytes::new(1);
343344
torrent.upsert_peer(&peer).await;
344345
let stats = torrent.get_stats().await;
345346

packages/torrent-repository/tests/repository/mod.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
use std::collections::{BTreeMap, HashSet};
22
use std::hash::{DefaultHasher, Hash, Hasher};
33

4+
use aquatic_udp_protocol::{AnnounceEvent, NumberOfBytes};
45
use rstest::{fixture, rstest};
56
use torrust_tracker_configuration::TrackerPolicy;
67
use torrust_tracker_primitives::info_hash::InfoHash;
78
use torrust_tracker_primitives::pagination::Pagination;
89
use torrust_tracker_primitives::swarm_metadata::SwarmMetadata;
9-
use torrust_tracker_primitives::{AnnounceEvent, NumberOfBytes, PersistentTorrents};
10+
use torrust_tracker_primitives::PersistentTorrents;
1011
use torrust_tracker_torrent_repository::entry::Entry as _;
1112
use torrust_tracker_torrent_repository::repository::dash_map_mutex_std::XacrimonDashMap;
1213
use torrust_tracker_torrent_repository::repository::rw_lock_std::RwLockStd;
@@ -99,7 +100,7 @@ fn downloaded() -> Entries {
99100
let mut peer = a_started_peer(3);
100101
torrent.upsert_peer(&peer);
101102
peer.event = AnnounceEvent::Completed;
102-
peer.left = NumberOfBytes(0);
103+
peer.left = NumberOfBytes::new(0);
103104
torrent.upsert_peer(&peer);
104105
vec![(InfoHash::default(), torrent)]
105106
}
@@ -121,7 +122,7 @@ fn three() -> Entries {
121122
let mut downloaded_peer = a_started_peer(3);
122123
downloaded.upsert_peer(&downloaded_peer);
123124
downloaded_peer.event = AnnounceEvent::Completed;
124-
downloaded_peer.left = NumberOfBytes(0);
125+
downloaded_peer.left = NumberOfBytes::new(0);
125126
downloaded.upsert_peer(&downloaded_peer);
126127
downloaded.hash(downloaded_h);
127128

0 commit comments

Comments
 (0)