From 66bbb655bff91a251ea7d1243c5ccac22dd8cfc7 Mon Sep 17 00:00:00 2001 From: nexy7574 Date: Sat, 21 Feb 2026 16:58:45 +0000 Subject: [PATCH] feat: Warn when server is overloaded --- src/api/server/send.rs | 2 +- src/service/transaction_ids/mod.rs | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/api/server/send.rs b/src/api/server/send.rs index 9fed097c..756b1803 100644 --- a/src/api/server/send.rs +++ b/src/api/server/send.rs @@ -7,7 +7,7 @@ use std::{ use axum::extract::State; use axum_client_ip::InsecureClientIp; use conduwuit::{ - Err, Error, Result, debug, debug_warn, err, error, info, + Err, Error, Result, debug, debug_warn, err, error, result::LogErr, trace, utils::{ diff --git a/src/service/transaction_ids/mod.rs b/src/service/transaction_ids/mod.rs index 09487580..bb3fc466 100644 --- a/src/service/transaction_ids/mod.rs +++ b/src/service/transaction_ids/mod.rs @@ -1,7 +1,7 @@ use std::{collections::HashMap, sync::Arc}; use async_trait::async_trait; -use conduwuit::{Error, Result, SyncRwLock}; +use conduwuit::{Error, Result, SyncRwLock, debug, debug_warn, warn}; use database::{Handle, Map}; use ruma::{ DeviceId, OwnedServerName, OwnedTransactionId, TransactionId, UserId, @@ -52,7 +52,6 @@ impl crate::Service for Service { } impl Service { - #[must_use] pub fn txn_active_handle_count(&self) -> usize { let state = self.servername_txnid_active.read(); @@ -106,16 +105,30 @@ impl Service { ) -> Result> { let mut state = self.servername_txnid_active.write(); if state.get(&key).is_some() { + debug!( + origin = ?key.0, + id = ?key.1, + "Origin re-sent already running transaction" + ); Err(Error::BadRequest( LimitExceeded { retry_after: None }, "Transaction is already being handled", )) } else if state.keys().any(|k| k.0 == key.0) { + debug_warn!( + origin = ?key.0, + "Got concurrent transaction request from an origin with an active transaction" + ); Err(Error::BadRequest( LimitExceeded { retry_after: None }, "Still processing another transaction from this origin", )) } else if state.len() >= self.max_active_txns { + warn!( + active = state.len(), + max = self.max_active_txns, + "Server is overloaded, dropping incoming transaction" + ); Err(Error::BadRequest( LimitExceeded { retry_after: None }, "Server is overloaded, try again later",