delete pointless bad_query_ratelimiter harming e2ee performance
Signed-off-by: strawberry <strawberry@puppygock.gay>
This commit is contained in:
parent
5d51adc29d
commit
3e64a5c907
2 changed files with 5 additions and 54 deletions
|
@ -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!({}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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!()) }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue