delete pointless bad_query_ratelimiter harming e2ee performance

Signed-off-by: strawberry <strawberry@puppygock.gay>
This commit is contained in:
strawberry 2024-12-11 19:46:19 -05:00
parent 5d51adc29d
commit 3e64a5c907
2 changed files with 5 additions and 54 deletions

View file

@ -1,10 +1,7 @@
use std::{ use std::collections::{BTreeMap, HashMap, HashSet};
collections::{hash_map, BTreeMap, HashMap, HashSet},
time::Instant,
};
use axum::extract::State; use axum::extract::State;
use conduit::{err, utils, utils::math::continue_exponential_backoff_secs, Err, Error, Result}; use conduit::{err, utils, Error, Result};
use futures::{stream::FuturesUnordered, StreamExt}; use futures::{stream::FuturesUnordered, StreamExt};
use ruma::{ use ruma::{
api::{ api::{
@ -345,41 +342,9 @@ where
let mut failures = BTreeMap::new(); let mut failures = BTreeMap::new();
let back_off = |id| async {
match services
.globals
.bad_query_ratelimiter
.write()
.expect("locked")
.entry(id)
{
hash_map::Entry::Vacant(e) => {
e.insert((Instant::now(), 1));
},
hash_map::Entry::Occupied(mut e) => {
*e.get_mut() = (Instant::now(), e.get().1.saturating_add(1));
},
}
};
let mut futures: FuturesUnordered<_> = get_over_federation let mut futures: FuturesUnordered<_> = get_over_federation
.into_iter() .into_iter()
.map(|(server, vec)| async move { .map(|(server, vec)| async move {
if let Some((time, tries)) = services
.globals
.bad_query_ratelimiter
.read()
.expect("locked")
.get(server)
{
// Exponential backoff
const MIN: u64 = 5 * 60;
const MAX: u64 = 60 * 60 * 24;
if continue_exponential_backoff_secs(MIN, MAX, time.elapsed(), *tries) {
return (server, Err!(BadServerResponse("bad query from {server:?}, still backing off")));
}
}
let mut device_keys_input_fed = BTreeMap::new(); let mut device_keys_input_fed = BTreeMap::new();
for (user_id, keys) in vec { for (user_id, keys) in vec {
device_keys_input_fed.insert(user_id.to_owned(), keys.clone()); device_keys_input_fed.insert(user_id.to_owned(), keys.clone());
@ -388,17 +353,18 @@ where
let request = federation::keys::get_keys::v1::Request { let request = federation::keys::get_keys::v1::Request {
device_keys: device_keys_input_fed, device_keys: device_keys_input_fed,
}; };
let response = services let response = services
.sending .sending
.send_federation_request(server, request) .send_federation_request(server, request)
.await; .await;
(server, Ok(response)) (server, response)
}) })
.collect(); .collect();
while let Some((server, response)) = futures.next().await { while let Some((server, response)) = futures.next().await {
if let Ok(Ok(response)) = response { if let Ok(response) = response {
for (user, master_key) in response.master_keys { for (user, master_key) in response.master_keys {
let (master_key_id, mut master_key) = parse_master_key(&user, &master_key)?; let (master_key_id, mut master_key) = parse_master_key(&user, &master_key)?;
@ -426,7 +392,6 @@ where
self_signing_keys.extend(response.self_signing_keys); self_signing_keys.extend(response.self_signing_keys);
device_keys.extend(response.device_keys); device_keys.extend(response.device_keys);
} else { } else {
back_off(server.to_owned()).await;
failures.insert(server.to_string(), json!({})); failures.insert(server.to_string(), json!({}));
} }
} }

View file

@ -21,7 +21,6 @@ pub struct Service {
pub config: Config, pub config: Config,
jwt_decoding_key: Option<jsonwebtoken::DecodingKey>, jwt_decoding_key: Option<jsonwebtoken::DecodingKey>,
pub bad_event_ratelimiter: Arc<RwLock<HashMap<OwnedEventId, RateLimitState>>>, pub bad_event_ratelimiter: Arc<RwLock<HashMap<OwnedEventId, RateLimitState>>>,
pub bad_query_ratelimiter: Arc<RwLock<HashMap<OwnedServerName, RateLimitState>>>,
pub stateres_mutex: Arc<Mutex<()>>, pub stateres_mutex: Arc<Mutex<()>>,
pub server_user: OwnedUserId, pub server_user: OwnedUserId,
pub admin_alias: OwnedRoomAliasId, pub admin_alias: OwnedRoomAliasId,
@ -71,7 +70,6 @@ impl crate::Service for Service {
config: config.clone(), config: config.clone(),
jwt_decoding_key, jwt_decoding_key,
bad_event_ratelimiter: Arc::new(RwLock::new(HashMap::new())), bad_event_ratelimiter: Arc::new(RwLock::new(HashMap::new())),
bad_query_ratelimiter: Arc::new(RwLock::new(HashMap::new())),
stateres_mutex: Arc::new(Mutex::new(())), stateres_mutex: Arc::new(Mutex::new(())),
admin_alias: RoomAliasId::parse(format!("#admins:{}", &config.server_name)) admin_alias: RoomAliasId::parse(format!("#admins:{}", &config.server_name))
.expect("#admins:server_name is valid alias name"), .expect("#admins:server_name is valid alias name"),
@ -100,13 +98,6 @@ impl crate::Service for Service {
.len(); .len();
writeln!(out, "bad_event_ratelimiter: {bad_event_ratelimiter}")?; writeln!(out, "bad_event_ratelimiter: {bad_event_ratelimiter}")?;
let bad_query_ratelimiter = self
.bad_query_ratelimiter
.read()
.expect("locked for reading")
.len();
writeln!(out, "bad_query_ratelimiter: {bad_query_ratelimiter}")?;
Ok(()) Ok(())
} }
@ -115,11 +106,6 @@ impl crate::Service for Service {
.write() .write()
.expect("locked for writing") .expect("locked for writing")
.clear(); .clear();
self.bad_query_ratelimiter
.write()
.expect("locked for writing")
.clear();
} }
fn name(&self) -> &str { service::make_name(std::module_path!()) } fn name(&self) -> &str { service::make_name(std::module_path!()) }