Skip to content

Commit e4c6000

Browse files
committed
refactor: [torrust#1382] add connection context to UDP server events
1 parent 74ffa4c commit e4c6000

File tree

9 files changed

+357
-105
lines changed

9 files changed

+357
-105
lines changed

packages/udp-tracker-server/src/handlers/announce.rs

+13-9
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use zerocopy::network_endian::I32;
1616

1717
use crate::error::Error;
1818
use crate::statistics as server_statistics;
19-
use crate::statistics::event::UdpRequestKind;
19+
use crate::statistics::event::{ConnectionContext, UdpRequestKind};
2020

2121
/// It handles the `Announce` request.
2222
///
@@ -45,13 +45,15 @@ pub async fn handle_announce(
4545
IpAddr::V4(_) => {
4646
udp_server_stats_event_sender
4747
.send_event(server_statistics::event::Event::Udp4Request {
48+
context: ConnectionContext::new(client_socket_addr, server_socket_addr),
4849
kind: UdpRequestKind::Announce,
4950
})
5051
.await;
5152
}
5253
IpAddr::V6(_) => {
5354
udp_server_stats_event_sender
5455
.send_event(server_statistics::event::Event::Udp6Request {
56+
context: ConnectionContext::new(client_socket_addr, server_socket_addr),
5557
kind: UdpRequestKind::Announce,
5658
})
5759
.await;
@@ -429,10 +431,14 @@ mod tests {
429431

430432
#[tokio::test]
431433
async fn should_send_the_upd4_announce_event() {
434+
let client_socket_addr = sample_ipv4_socket_address();
435+
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969);
436+
432437
let mut udp_server_stats_event_sender_mock = MockUdpServerStatsEventSender::new();
433438
udp_server_stats_event_sender_mock
434439
.expect_send_event()
435440
.with(eq(server_statistics::event::Event::Udp4Request {
441+
context: server_statistics::event::ConnectionContext::new(client_socket_addr, server_socket_addr),
436442
kind: UdpRequestKind::Announce,
437443
}))
438444
.times(1)
@@ -443,9 +449,6 @@ mod tests {
443449
let (core_tracker_services, core_udp_tracker_services, _server_udp_tracker_services) =
444450
initialize_core_tracker_services_for_default_tracker_configuration();
445451

446-
let client_socket_addr = sample_ipv4_socket_address();
447-
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969);
448-
449452
handle_announce(
450453
&core_udp_tracker_services.announce_service,
451454
client_socket_addr,
@@ -771,10 +774,14 @@ mod tests {
771774

772775
#[tokio::test]
773776
async fn should_send_the_upd6_announce_event() {
777+
let client_socket_addr = sample_ipv6_remote_addr();
778+
let server_socket_addr = SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969);
779+
774780
let mut udp_server_stats_event_sender_mock = MockUdpServerStatsEventSender::new();
775781
udp_server_stats_event_sender_mock
776782
.expect_send_event()
777783
.with(eq(server_statistics::event::Event::Udp6Request {
784+
context: server_statistics::event::ConnectionContext::new(client_socket_addr, server_socket_addr),
778785
kind: UdpRequestKind::Announce,
779786
}))
780787
.times(1)
@@ -785,9 +792,6 @@ mod tests {
785792
let (core_tracker_services, core_udp_tracker_services, _server_udp_tracker_services) =
786793
initialize_core_tracker_services_for_default_tracker_configuration();
787794

788-
let client_socket_addr = sample_ipv6_remote_addr();
789-
let server_socket_addr = SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969);
790-
791795
let announce_request = AnnounceRequestBuilder::default()
792796
.with_connection_id(make(gen_remote_fingerprint(&client_socket_addr), sample_issue_time()).unwrap())
793797
.into();
@@ -819,7 +823,6 @@ mod tests {
819823
use bittorrent_tracker_core::whitelist::repository::in_memory::InMemoryWhitelist;
820824
use bittorrent_udp_tracker_core::connection_cookie::{gen_remote_fingerprint, make};
821825
use bittorrent_udp_tracker_core::services::announce::AnnounceService;
822-
use bittorrent_udp_tracker_core::statistics::event::ConnectionContext;
823826
use bittorrent_udp_tracker_core::{self, statistics as core_statistics};
824827
use mockall::predicate::eq;
825828

@@ -860,7 +863,7 @@ mod tests {
860863
udp_core_stats_event_sender_mock
861864
.expect_send_event()
862865
.with(eq(core_statistics::event::Event::UdpAnnounce {
863-
context: ConnectionContext::new(client_socket_addr, server_socket_addr),
866+
context: core_statistics::event::ConnectionContext::new(client_socket_addr, server_socket_addr),
864867
}))
865868
.times(1)
866869
.returning(|_| Box::pin(future::ready(Some(Ok(())))));
@@ -871,6 +874,7 @@ mod tests {
871874
udp_server_stats_event_sender_mock
872875
.expect_send_event()
873876
.with(eq(server_statistics::event::Event::Udp6Request {
877+
context: server_statistics::event::ConnectionContext::new(client_socket_addr, server_socket_addr),
874878
kind: UdpRequestKind::Announce,
875879
}))
876880
.times(1)

packages/udp-tracker-server/src/handlers/connect.rs

+10-7
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ use bittorrent_udp_tracker_core::services::connect::ConnectService;
77
use tracing::{instrument, Level};
88

99
use crate::statistics as server_statistics;
10-
use crate::statistics::event::UdpRequestKind;
10+
use crate::statistics::event::{ConnectionContext, UdpRequestKind};
1111

1212
/// It handles the `Connect` request.
1313
#[instrument(fields(transaction_id), skip(connect_service, opt_udp_server_stats_event_sender), ret(level = Level::TRACE))]
1414
pub async fn handle_connect(
15-
remote_addr: SocketAddr,
16-
server_addr: SocketAddr,
15+
client_socket_addr: SocketAddr,
16+
server_socket_addr: SocketAddr,
1717
request: &ConnectRequest,
1818
connect_service: &Arc<ConnectService>,
1919
opt_udp_server_stats_event_sender: &Arc<Option<Box<dyn server_statistics::event::sender::Sender>>>,
@@ -23,17 +23,19 @@ pub async fn handle_connect(
2323
tracing::trace!("handle connect");
2424

2525
if let Some(udp_server_stats_event_sender) = opt_udp_server_stats_event_sender.as_deref() {
26-
match remote_addr.ip() {
26+
match client_socket_addr.ip() {
2727
IpAddr::V4(_) => {
2828
udp_server_stats_event_sender
2929
.send_event(server_statistics::event::Event::Udp4Request {
30+
context: ConnectionContext::new(client_socket_addr, server_socket_addr),
3031
kind: UdpRequestKind::Connect,
3132
})
3233
.await;
3334
}
3435
IpAddr::V6(_) => {
3536
udp_server_stats_event_sender
3637
.send_event(server_statistics::event::Event::Udp6Request {
38+
context: ConnectionContext::new(client_socket_addr, server_socket_addr),
3739
kind: UdpRequestKind::Connect,
3840
})
3941
.await;
@@ -42,7 +44,7 @@ pub async fn handle_connect(
4244
}
4345

4446
let connection_id = connect_service
45-
.handle_connect(remote_addr, server_addr, cookie_issue_time)
47+
.handle_connect(client_socket_addr, server_socket_addr, cookie_issue_time)
4648
.await;
4749

4850
build_response(*request, connection_id)
@@ -70,7 +72,6 @@ mod tests {
7072
use bittorrent_udp_tracker_core::connection_cookie::make;
7173
use bittorrent_udp_tracker_core::services::connect::ConnectService;
7274
use bittorrent_udp_tracker_core::statistics as core_statistics;
73-
use bittorrent_udp_tracker_core::statistics::event::ConnectionContext;
7475
use mockall::predicate::eq;
7576

7677
use crate::handlers::handle_connect;
@@ -215,6 +216,7 @@ mod tests {
215216
udp_server_stats_event_sender_mock
216217
.expect_send_event()
217218
.with(eq(server_statistics::event::Event::Udp4Request {
219+
context: server_statistics::event::ConnectionContext::new(client_socket_addr, server_socket_addr),
218220
kind: UdpRequestKind::Connect,
219221
}))
220222
.times(1)
@@ -244,7 +246,7 @@ mod tests {
244246
udp_core_stats_event_sender_mock
245247
.expect_send_event()
246248
.with(eq(core_statistics::event::Event::UdpConnect {
247-
context: ConnectionContext::new(client_socket_addr, server_socket_addr),
249+
context: core_statistics::event::ConnectionContext::new(client_socket_addr, server_socket_addr),
248250
}))
249251
.times(1)
250252
.returning(|_| Box::pin(future::ready(Some(Ok(())))));
@@ -255,6 +257,7 @@ mod tests {
255257
udp_server_stats_event_sender_mock
256258
.expect_send_event()
257259
.with(eq(server_statistics::event::Event::Udp6Request {
260+
context: server_statistics::event::ConnectionContext::new(client_socket_addr, server_socket_addr),
258261
kind: UdpRequestKind::Connect,
259262
}))
260263
.times(1)

packages/udp-tracker-server/src/handlers/error.rs

+13-8
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@ use zerocopy::network_endian::I32;
1212

1313
use crate::error::Error;
1414
use crate::statistics as server_statistics;
15+
use crate::statistics::event::ConnectionContext;
1516

1617
#[allow(clippy::too_many_arguments)]
1718
#[instrument(fields(transaction_id), skip(opt_udp_server_stats_event_sender), ret(level = Level::TRACE))]
1819
pub async fn handle_error(
19-
remote_addr: SocketAddr,
20-
local_addr: SocketAddr,
20+
client_socket_addr: SocketAddr,
21+
server_socket_addr: SocketAddr,
2122
request_id: Uuid,
2223
opt_udp_server_stats_event_sender: &Arc<Option<Box<dyn server_statistics::event::sender::Sender>>>,
2324
cookie_valid_range: Range<f64>,
@@ -29,10 +30,10 @@ pub async fn handle_error(
2930
match transaction_id {
3031
Some(transaction_id) => {
3132
let transaction_id = transaction_id.0.to_string();
32-
tracing::error!(target: UDP_TRACKER_LOG_TARGET, error = %e, %remote_addr, %local_addr, %request_id, %transaction_id, "response error");
33+
tracing::error!(target: UDP_TRACKER_LOG_TARGET, error = %e, %client_socket_addr, %server_socket_addr, %request_id, %transaction_id, "response error");
3334
}
3435
None => {
35-
tracing::error!(target: UDP_TRACKER_LOG_TARGET, error = %e, %remote_addr, %local_addr, %request_id, "response error");
36+
tracing::error!(target: UDP_TRACKER_LOG_TARGET, error = %e, %client_socket_addr, %server_socket_addr, %request_id, "response error");
3637
}
3738
}
3839

@@ -43,7 +44,7 @@ pub async fn handle_error(
4344
transaction_id,
4445
err,
4546
} => {
46-
if let Err(e) = check(connection_id, gen_remote_fingerprint(&remote_addr), cookie_valid_range) {
47+
if let Err(e) = check(connection_id, gen_remote_fingerprint(&client_socket_addr), cookie_valid_range) {
4748
(e.to_string(), Some(*transaction_id))
4849
} else {
4950
((*err).to_string(), Some(*transaction_id))
@@ -57,15 +58,19 @@ pub async fn handle_error(
5758

5859
if e.1.is_some() {
5960
if let Some(udp_server_stats_event_sender) = opt_udp_server_stats_event_sender.as_deref() {
60-
match remote_addr {
61+
match client_socket_addr {
6162
SocketAddr::V4(_) => {
6263
udp_server_stats_event_sender
63-
.send_event(server_statistics::event::Event::Udp4Error)
64+
.send_event(server_statistics::event::Event::Udp4Error {
65+
context: ConnectionContext::new(client_socket_addr, server_socket_addr),
66+
})
6467
.await;
6568
}
6669
SocketAddr::V6(_) => {
6770
udp_server_stats_event_sender
68-
.send_event(server_statistics::event::Event::Udp6Error)
71+
.send_event(server_statistics::event::Event::Udp6Error {
72+
context: ConnectionContext::new(client_socket_addr, server_socket_addr),
73+
})
6974
.await;
7075
}
7176
}

packages/udp-tracker-server/src/handlers/scrape.rs

+13-7
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use zerocopy::network_endian::I32;
1414

1515
use crate::error::Error;
1616
use crate::statistics as server_statistics;
17-
use crate::statistics::event::UdpRequestKind;
17+
use crate::statistics::event::{ConnectionContext, UdpRequestKind};
1818

1919
/// It handles the `Scrape` request.
2020
///
@@ -41,13 +41,15 @@ pub async fn handle_scrape(
4141
IpAddr::V4(_) => {
4242
udp_server_stats_event_sender
4343
.send_event(server_statistics::event::Event::Udp4Request {
44+
context: ConnectionContext::new(client_socket_addr, server_socket_addr),
4445
kind: UdpRequestKind::Scrape,
4546
})
4647
.await;
4748
}
4849
IpAddr::V6(_) => {
4950
udp_server_stats_event_sender
5051
.send_event(server_statistics::event::Event::Udp6Request {
52+
context: ConnectionContext::new(client_socket_addr, server_socket_addr),
5153
kind: UdpRequestKind::Scrape,
5254
})
5355
.await;
@@ -368,23 +370,25 @@ mod tests {
368370
sample_ipv4_remote_addr, MockUdpServerStatsEventSender,
369371
};
370372
use crate::statistics as server_statistics;
373+
use crate::statistics::event::ConnectionContext;
371374

372375
#[tokio::test]
373376
async fn should_send_the_upd4_scrape_event() {
377+
let client_socket_addr = sample_ipv4_remote_addr();
378+
let server_socket_addr = SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969);
379+
374380
let mut udp_server_stats_event_sender_mock = MockUdpServerStatsEventSender::new();
375381
udp_server_stats_event_sender_mock
376382
.expect_send_event()
377383
.with(eq(server_statistics::event::Event::Udp4Request {
384+
context: ConnectionContext::new(client_socket_addr, server_socket_addr),
378385
kind: server_statistics::event::UdpRequestKind::Scrape,
379386
}))
380387
.times(1)
381388
.returning(|_| Box::pin(future::ready(Some(Ok(())))));
382389
let udp_server_stats_event_sender: Arc<Option<Box<dyn server_statistics::event::sender::Sender>>> =
383390
Arc::new(Some(Box::new(udp_server_stats_event_sender_mock)));
384391

385-
let client_socket_addr = sample_ipv4_remote_addr();
386-
let server_socket_addr = SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969);
387-
388392
let (_core_tracker_services, core_udp_tracker_services, _server_udp_tracker_services) =
389393
initialize_core_tracker_services_for_default_tracker_configuration();
390394

@@ -415,23 +419,25 @@ mod tests {
415419
sample_ipv6_remote_addr, MockUdpServerStatsEventSender,
416420
};
417421
use crate::statistics as server_statistics;
422+
use crate::statistics::event::ConnectionContext;
418423

419424
#[tokio::test]
420425
async fn should_send_the_upd6_scrape_event() {
426+
let client_socket_addr = sample_ipv6_remote_addr();
427+
let server_socket_addr = SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969);
428+
421429
let mut udp_server_stats_event_sender_mock = MockUdpServerStatsEventSender::new();
422430
udp_server_stats_event_sender_mock
423431
.expect_send_event()
424432
.with(eq(server_statistics::event::Event::Udp6Request {
433+
context: ConnectionContext::new(client_socket_addr, server_socket_addr),
425434
kind: server_statistics::event::UdpRequestKind::Scrape,
426435
}))
427436
.times(1)
428437
.returning(|_| Box::pin(future::ready(Some(Ok(())))));
429438
let udp_server_stats_event_sender: Arc<Option<Box<dyn server_statistics::event::sender::Sender>>> =
430439
Arc::new(Some(Box::new(udp_server_stats_event_sender_mock)));
431440

432-
let client_socket_addr = sample_ipv6_remote_addr();
433-
let server_socket_addr = SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969);
434-
435441
let (_core_tracker_services, core_udp_tracker_services, _server_udp_tracker_services) =
436442
initialize_core_tracker_services_for_default_tracker_configuration();
437443

packages/udp-tracker-server/src/server/launcher.rs

+17-6
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ use crate::server::bound_socket::BoundSocket;
2121
use crate::server::processor::Processor;
2222
use crate::server::receiver::Receiver;
2323
use crate::statistics;
24+
use crate::statistics::event::ConnectionContext;
2425

2526
const IP_BANS_RESET_INTERVAL_IN_SECS: u64 = 3600;
2627

@@ -129,9 +130,9 @@ impl Launcher {
129130
) {
130131
let active_requests = &mut ActiveRequests::default();
131132

132-
let addr = receiver.bound_socket_address();
133+
let server_socket_addr = receiver.bound_socket_address();
133134

134-
let local_addr = format!("udp://{addr}");
135+
let local_addr = format!("udp://{server_socket_addr}");
135136

136137
let cookie_lifetime = cookie_lifetime.as_secs_f64();
137138

@@ -167,17 +168,23 @@ impl Launcher {
167168
}
168169
};
169170

171+
let client_socket_addr = req.from;
172+
170173
if let Some(udp_server_stats_event_sender) = udp_tracker_server_container.udp_server_stats_event_sender.as_deref()
171174
{
172175
match req.from.ip() {
173176
IpAddr::V4(_) => {
174177
udp_server_stats_event_sender
175-
.send_event(statistics::event::Event::Udp4IncomingRequest)
178+
.send_event(statistics::event::Event::Udp4IncomingRequest {
179+
context: ConnectionContext::new(client_socket_addr, server_socket_addr),
180+
})
176181
.await;
177182
}
178183
IpAddr::V6(_) => {
179184
udp_server_stats_event_sender
180-
.send_event(statistics::event::Event::Udp6IncomingRequest)
185+
.send_event(statistics::event::Event::Udp6IncomingRequest {
186+
context: ConnectionContext::new(client_socket_addr, server_socket_addr),
187+
})
181188
.await;
182189
}
183190
}
@@ -190,7 +197,9 @@ impl Launcher {
190197
udp_tracker_server_container.udp_server_stats_event_sender.as_deref()
191198
{
192199
udp_server_stats_event_sender
193-
.send_event(statistics::event::Event::UdpRequestBanned)
200+
.send_event(statistics::event::Event::UdpRequestBanned {
201+
context: ConnectionContext::new(client_socket_addr, server_socket_addr),
202+
})
194203
.await;
195204
}
196205

@@ -230,7 +239,9 @@ impl Launcher {
230239
udp_tracker_server_container.udp_server_stats_event_sender.as_deref()
231240
{
232241
udp_server_stats_event_sender
233-
.send_event(statistics::event::Event::UdpRequestAborted)
242+
.send_event(statistics::event::Event::UdpRequestAborted {
243+
context: ConnectionContext::new(client_socket_addr, server_socket_addr),
244+
})
234245
.await;
235246
}
236247
}

0 commit comments

Comments
 (0)