optimize override ips; utilize all ips from cache

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk 2024-10-31 11:49:00 +00:00
parent f746be82c1
commit 1f1e2d547c
3 changed files with 15 additions and 13 deletions

View file

@ -10,7 +10,7 @@ use ipaddress::IPAddress;
use ruma::ServerName; use ruma::ServerName;
use super::{ use super::{
cache::{CachedDest, CachedOverride}, cache::{CachedDest, CachedOverride, MAX_IPS},
fed::{add_port_to_hostname, get_ip_with_port, FedDest, PortString}, fed::{add_port_to_hostname, get_ip_with_port, FedDest, PortString},
}; };
@ -266,9 +266,9 @@ impl super::Service {
} }
self.set_cached_override( self.set_cached_override(
overname.to_owned(), overname,
CachedOverride { CachedOverride {
ips: override_ip.iter().collect(), ips: override_ip.into_iter().take(MAX_IPS).collect(),
port, port,
expire: CachedOverride::default_expire(), expire: CachedOverride::default_expire(),
}, },

View file

@ -5,6 +5,7 @@ use std::{
time::SystemTime, time::SystemTime,
}; };
use arrayvec::ArrayVec;
use conduit::{trace, utils::rand}; use conduit::{trace, utils::rand};
use ruma::{OwnedServerName, ServerName}; use ruma::{OwnedServerName, ServerName};
@ -24,7 +25,7 @@ pub struct CachedDest {
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct CachedOverride { pub struct CachedOverride {
pub ips: Vec<IpAddr>, pub ips: IpAddrs,
pub port: u16, pub port: u16,
pub expire: SystemTime, pub expire: SystemTime,
} }
@ -32,6 +33,9 @@ pub struct CachedOverride {
pub type WellKnownMap = HashMap<OwnedServerName, CachedDest>; pub type WellKnownMap = HashMap<OwnedServerName, CachedDest>;
pub type TlsNameMap = HashMap<String, CachedOverride>; pub type TlsNameMap = HashMap<String, CachedOverride>;
pub type IpAddrs = ArrayVec<IpAddr, MAX_IPS>;
pub(crate) const MAX_IPS: usize = 3;
impl Cache { impl Cache {
pub(super) fn new() -> Arc<Self> { pub(super) fn new() -> Arc<Self> {
Arc::new(Self { Arc::new(Self {
@ -61,13 +65,13 @@ impl super::Service {
.cloned() .cloned()
} }
pub fn set_cached_override(&self, name: String, over: CachedOverride) -> Option<CachedOverride> { pub fn set_cached_override(&self, name: &str, over: CachedOverride) -> Option<CachedOverride> {
trace!(?name, ?over, "set cached override"); trace!(?name, ?over, "set cached override");
self.cache self.cache
.overrides .overrides
.write() .write()
.expect("locked for writing") .expect("locked for writing")
.insert(name, over) .insert(name.into(), over)
} }
#[must_use] #[must_use]

View file

@ -1,4 +1,4 @@
use std::{iter, net::SocketAddr, sync::Arc, time::Duration}; use std::{net::SocketAddr, sync::Arc, time::Duration};
use conduit::{err, Result, Server}; use conduit::{err, Result, Server};
use futures::FutureExt; use futures::FutureExt;
@ -101,14 +101,12 @@ impl Resolve for Hooked {
} }
async fn cached_to_reqwest(cached: CachedOverride) -> ResolvingResult { async fn cached_to_reqwest(cached: CachedOverride) -> ResolvingResult {
let first_ip = cached let addrs = cached
.ips .ips
.first() .into_iter()
.expect("must provide at least one override"); .map(move |ip| SocketAddr::new(ip, cached.port));
let saddr = SocketAddr::new(*first_ip, cached.port); Ok(Box::new(addrs))
Ok(Box::new(iter::once(saddr)))
} }
async fn resolve_to_reqwest(resolver: Arc<TokioAsyncResolver>, name: Name) -> ResolvingResult { async fn resolve_to_reqwest(resolver: Arc<TokioAsyncResolver>, name: Name) -> ResolvingResult {