Skip to content

Commit f50db17

Browse files
refactor(iroh-relay)!: server actor task is not a task or actor anymore (#3093)
## Description - Restructures the server part of the relay to not mainly run an actor, but onyl proxy between a single actor per connection. - removes notifying the server about preferred/home relay status, to simplify the protocol, as this was only used for metrics Replaces #3073 ## Breaking Changes - renamed `iroh_relay::server::ClientConnRateLimit` to `ClientRateLimit` - removed `iroh_relay::server::MaybeTlsStreamServer` from the public API - removed `iroh_relay::client::SendMessage::NotePreferred` ## Notes & open questions <!-- Any notes, remarks or open questions you have to make about the PR. --> ## Change checklist - [ ] Self-review. - [ ] Documentation updates following the [style guide](https://rust-lang.github.io/rfcs/1574-more-api-documentation-conventions.html#appendix-a-full-conventions-text), if relevant. - [ ] Tests if relevant. - [ ] All breaking changes documented.
1 parent 7ad531e commit f50db17

File tree

11 files changed

+276
-870
lines changed

11 files changed

+276
-870
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

iroh-relay/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ webpki = { package = "rustls-webpki", version = "0.102" }
9090
webpki-roots = "0.26"
9191
data-encoding = "2.6.0"
9292
lru = "0.12"
93+
dashmap = { version = "6.1.0", optional = true }
9394

9495
[dev-dependencies]
9596
clap = { version = "4", features = ["derive"] }
@@ -116,6 +117,7 @@ default = ["metrics"]
116117
server = [
117118
"dep:tokio-rustls-acme",
118119
"dep:clap",
120+
"dep:dashmap",
119121
"dep:toml",
120122
"dep:rustls-pemfile",
121123
"dep:regex",

iroh-relay/src/client/conn.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -327,8 +327,6 @@ impl TryFrom<Frame> for ReceivedMessage {
327327
pub enum SendMessage {
328328
/// Send a packet of data to the [`NodeId`].
329329
SendPacket(NodeId, Bytes),
330-
/// Mark or unmark the connected relay as the home relay.
331-
NotePreferred(bool),
332330
/// Sends a ping message to the connected relay server.
333331
Ping([u8; 8]),
334332
/// Sends a pong message to the connected relay server.
@@ -339,7 +337,6 @@ impl From<SendMessage> for Frame {
339337
fn from(source: SendMessage) -> Self {
340338
match source {
341339
SendMessage::SendPacket(dst_key, packet) => Frame::SendPacket { dst_key, packet },
342-
SendMessage::NotePreferred(preferred) => Frame::NotePreferred { preferred },
343340
SendMessage::Ping(data) => Frame::Ping { data },
344341
SendMessage::Pong(data) => Frame::Pong { data },
345342
}

iroh-relay/src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use iroh_relay::{
1616
DEFAULT_HTTPS_PORT, DEFAULT_HTTP_PORT, DEFAULT_METRICS_PORT, DEFAULT_RELAY_QUIC_PORT,
1717
DEFAULT_STUN_PORT,
1818
},
19-
server::{self as relay, ClientConnRateLimit, QuicConfig},
19+
server::{self as relay, ClientRateLimit, QuicConfig},
2020
};
2121
use serde::{Deserialize, Serialize};
2222
use tokio_rustls_acme::{caches::DirCache, AcmeConfig};
@@ -543,7 +543,7 @@ async fn build_relay_config(cfg: Config) -> Result<relay::ServerConfig<std::io::
543543
bail!("bytes_per_seconds must be specified to enable the rate-limiter");
544544
}
545545
match rx.bytes_per_second {
546-
Some(bps) => Some(ClientConnRateLimit {
546+
Some(bps) => Some(ClientRateLimit {
547547
bytes_per_second: bps
548548
.try_into()
549549
.context("bytes_per_second must be non-zero u32")?,

iroh-relay/src/protos/relay.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,6 @@ const MAGIC: &str = "RELAY🔑";
4343

4444
#[cfg(feature = "server")]
4545
pub(crate) const KEEP_ALIVE: Duration = Duration::from_secs(60);
46-
// TODO: what should this be?
47-
#[cfg(feature = "server")]
48-
pub(crate) const SERVER_CHANNEL_SIZE: usize = 1024 * 100;
4946
/// The number of packets buffered for sending per client
5047
#[cfg(feature = "server")]
5148
pub(crate) const PER_CLIENT_SEND_QUEUE_DEPTH: usize = 512; //32;
@@ -181,7 +178,7 @@ pub(crate) async fn recv_client_key<S: Stream<Item = anyhow::Result<Frame>> + Un
181178

182179
// TODO: variable recv size: 256 * 1024
183180
let buf = tokio::time::timeout(
184-
Duration::from_secs(10),
181+
std::time::Duration::from_secs(10),
185182
recv_frame(FrameType::ClientInfo, stream),
186183
)
187184
.await
@@ -593,6 +590,7 @@ mod tests {
593590
use super::*;
594591

595592
#[tokio::test]
593+
#[cfg(feature = "server")]
596594
async fn test_basic_read_write() -> anyhow::Result<()> {
597595
let (reader, writer) = tokio::io::duplex(1024);
598596
let mut reader = FramedRead::new(reader, RelayCodec::test());

iroh-relay/src/server.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@ use crate::{
4242
quic::server::{QuicServer, ServerHandle as QuicServerHandle},
4343
};
4444

45-
pub(crate) mod actor;
46-
pub(crate) mod client_conn;
45+
mod client;
4746
mod clients;
4847
mod http_server;
4948
mod metrics;
@@ -55,7 +54,6 @@ pub mod testing;
5554
pub use self::{
5655
metrics::{Metrics, StunMetrics},
5756
resolver::{ReloadingResolver, DEFAULT_CERT_RELOAD_INTERVAL},
58-
streams::MaybeTlsStream as MaybeTlsStreamServer,
5957
};
6058

6159
const NO_CONTENT_CHALLENGE_HEADER: &str = "X-Tailscale-Challenge";
@@ -177,12 +175,12 @@ pub struct Limits {
177175
/// Burst limit for accepting new connection. Unlimited if not set.
178176
pub accept_conn_burst: Option<usize>,
179177
/// Rate limits for incoming traffic from a client connection.
180-
pub client_rx: Option<ClientConnRateLimit>,
178+
pub client_rx: Option<ClientRateLimit>,
181179
}
182180

183181
/// Per-client rate limit configuration.
184182
#[derive(Debug, Copy, Clone)]
185-
pub struct ClientConnRateLimit {
183+
pub struct ClientRateLimit {
186184
/// Max number of bytes per second to read from the client connection.
187185
pub bytes_per_second: NonZeroU32,
188186
/// Max number of bytes to read in a single burst.

0 commit comments

Comments
 (0)