Skip to content

Commit 1df8c6c

Browse files
committed
Adding UDP customization and configurable through the config file
1 parent 1e3d3f5 commit 1df8c6c

File tree

9 files changed

+522
-457
lines changed

9 files changed

+522
-457
lines changed

Cargo.lock

Lines changed: 482 additions & 448 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "torrust-actix"
3-
version = "4.0.11"
3+
version = "4.0.13"
44
edition = "2024"
55
license = "AGPL-3.0"
66
authors = [
@@ -46,6 +46,7 @@ serde = { version = "^1.0", features = ["derive"] }
4646
serde_json = { version = "^1.0", features = ["preserve_order"] }
4747
serde_millis = "^0.1"
4848
sha1 = "^0.10"
49+
socket2 = "^0.6"
4950
sqlx = { version = "^0.8", features = ["mysql", "postgres", "sqlite", "runtime-tokio-rustls"] }
5051
thiserror = "^2.0"
5152
tokio = { version = "^1.47", features = ["full"] }

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,15 @@ UDP_0_THREADS <UINT64>
172172

173173
### ChangeLog
174174

175+
#### v4.0.13
176+
* Added further UDP improvement by adding customization, also added to the config:
177+
* Receive Buffer Size
178+
* Send Buffer Size
179+
* Reuse of Address
180+
181+
#### v4.0.12
182+
* Updating libraries and cleanup code
183+
175184
#### v4.0.11
176185
* Updating libraries
177186
* Adding healthcheck for Docker through Python check script

docker/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ FROM rust:alpine
22

33
RUN apk add git musl-dev curl pkgconfig openssl-dev openssl-libs-static
44
RUN git clone https://github.com/Power2All/torrust-actix.git /app/torrust-actix
5-
RUN cd /app/torrust-actix && git checkout tags/v4.0.12
5+
RUN cd /app/torrust-actix && git checkout tags/v4.0.13
66
WORKDIR /app/torrust-actix
77
RUN cd /app/torrust-actix
88
RUN cargo build --release && rm -Rf target/release/.fingerprint target/release/build target/release/deps target/release/examples target/release/incremental

src/config/impls/configuration.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,9 @@ impl Configuration {
123123
enabled: true,
124124
bind_address: String::from("0.0.0.0:6969"),
125125
threads: available_parallelism().unwrap().get() as u64,
126+
receive_buffer_size: 134217728,
127+
send_buffer_size: 67108864,
128+
reuse_address: true
126129
}
127130
),
128131
api_server: vec!(

src/config/structs/udp_trackers_config.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,8 @@ use serde::{Deserialize, Serialize};
44
pub struct UdpTrackersConfig {
55
pub enabled: bool,
66
pub bind_address: String,
7-
pub threads: u64
7+
pub threads: u64,
8+
pub receive_buffer_size: usize,
9+
pub send_buffer_size: usize,
10+
pub reuse_address: bool
811
}

src/main.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,9 +196,12 @@ fn main() -> std::io::Result<()>
196196
udp_check_host_and_port_used(udp_server_object.bind_address.clone());
197197
let address: SocketAddr = udp_server_object.bind_address.parse().unwrap();
198198
let threads: u64 = udp_server_object.threads;
199+
let recv_buffer_size: usize = udp_server_object.receive_buffer_size;
200+
let send_buffer_size: usize = udp_server_object.send_buffer_size;
201+
let reuse_address: bool = udp_server_object.reuse_address;
199202
let tracker_clone = tracker.clone();
200203
let tokio_udp = Arc::new(Builder::new_multi_thread().thread_name("udp").worker_threads(threads as usize).enable_all().build()?);
201-
udp_futures.push(udp_service(address, threads, tracker_clone, udp_rx.clone(), tokio_udp.clone()).await);
204+
udp_futures.push(udp_service(address, threads, recv_buffer_size, send_buffer_size, reuse_address, tracker_clone, udp_rx.clone(), tokio_udp.clone()).await);
202205
udp_tokio_threads.push(tokio_udp.clone());
203206
}
204207
}

src/udp/impls/udp_server.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr};
33
use std::sync::Arc;
44
use std::time::SystemTime;
55
use log::{debug, info};
6+
use socket2::{Socket, Domain, Type, Protocol};
67
use tokio::net::UdpSocket;
78
use crate::stats::enums::stats_event::StatsEvent;
89
use crate::tracker::enums::torrent_peers_type::TorrentPeersType;
@@ -34,12 +35,23 @@ use crate::udp::udp::{MAX_PACKET_SIZE, MAX_SCRAPE_TORRENTS};
3435

3536
impl UdpServer {
3637
#[tracing::instrument(level = "debug")]
37-
pub async fn new(tracker: Arc<TorrentTracker>, bind_address: SocketAddr, threads: u64) -> tokio::io::Result<UdpServer>
38+
pub async fn new(tracker: Arc<TorrentTracker>, bind_address: SocketAddr, threads: u64, recv_buffer_size: usize, send_buffer_size: usize, reuse_address: bool) -> tokio::io::Result<UdpServer>
3839
{
39-
let socket = UdpSocket::bind(bind_address).await?;
40+
let domain = if bind_address.is_ipv4() { Domain::IPV4 } else { Domain::IPV6 };
41+
let socket = Socket::new(domain, Type::DGRAM, Some(Protocol::UDP))?;
42+
43+
socket.set_recv_buffer_size(recv_buffer_size).map_err(|e| tokio::io::Error::new(tokio::io::ErrorKind::Other, e))?;
44+
socket.set_send_buffer_size(send_buffer_size).map_err(|e| tokio::io::Error::new(tokio::io::ErrorKind::Other, e))?;
45+
socket.set_reuse_address(reuse_address).map_err(|e| tokio::io::Error::new(tokio::io::ErrorKind::Other, e))?;
46+
socket.bind(&bind_address.into()).map_err(|e| tokio::io::Error::new(tokio::io::ErrorKind::Other, e))?;
47+
socket.set_nonblocking(true).map_err(|e| tokio::io::Error::new(tokio::io::ErrorKind::Other, e))?;
48+
49+
// Convert to std::net::UdpSocket, then to tokio::net::UdpSocket
50+
let std_socket: std::net::UdpSocket = socket.into();
51+
let tokio_socket = UdpSocket::from_std(std_socket)?;
4052

4153
Ok(UdpServer {
42-
socket: Arc::new(socket),
54+
socket: Arc::new(tokio_socket),
4355
threads,
4456
tracker,
4557
})

src/udp/udp.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ pub const PROTOCOL_IDENTIFIER: i64 = 4_497_486_125_440;
1111
pub const MAX_SCRAPE_TORRENTS: u8 = 74;
1212
pub const MAX_PACKET_SIZE: usize = 1496;
1313

14-
pub async fn udp_service(addr: SocketAddr, threads: u64, data: Arc<TorrentTracker>, rx: tokio::sync::watch::Receiver<bool>, tokio_udp: Arc<Runtime>) -> JoinHandle<()>
14+
pub async fn udp_service(addr: SocketAddr, threads: u64, recv_buffer_size: usize, send_buffer_size: usize, reuse_address: bool, data: Arc<TorrentTracker>, rx: tokio::sync::watch::Receiver<bool>, tokio_udp: Arc<Runtime>) -> JoinHandle<()>
1515
{
16-
let udp_server = UdpServer::new(data, addr, threads).await.unwrap_or_else(|e| {
16+
let udp_server = UdpServer::new(data, addr, threads, recv_buffer_size, send_buffer_size, reuse_address).await.unwrap_or_else(|e| {
1717
error!("Could not listen to the UDP port: {e}");
1818
exit(1);
1919
});

0 commit comments

Comments
 (0)