1
0
Fork 0
mirror of https://forgejo.ellis.link/continuwuation/continuwuity.git synced 2025-07-28 10:48:30 +00:00
continuwuity/src/service/mod.rs

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

299 lines
7.3 KiB
Rust
Raw Normal View History

2022-10-05 18:36:12 +02:00
use std::{
2023-07-23 21:57:11 +02:00
collections::{BTreeMap, HashMap},
sync::{Arc, Mutex as StdMutex},
2022-10-05 18:36:12 +02:00
};
2022-10-05 20:33:55 +02:00
use lru_cache::LruCache;
use tokio::sync::{broadcast, Mutex, RwLock};
2022-10-05 20:33:55 +02:00
use crate::{Config, LogLevelReloadHandles, Result};
2022-10-05 12:45:54 +02:00
pub(crate) mod account_data;
pub(crate) mod admin;
pub(crate) mod appservice;
pub(crate) mod globals;
pub(crate) mod key_backups;
pub(crate) mod media;
pub(crate) mod pdu;
pub(crate) mod presence;
pub(crate) mod pusher;
pub(crate) mod rooms;
pub(crate) mod sending;
pub(crate) mod transaction_ids;
pub(crate) mod uiaa;
pub(crate) mod users;
pub(crate) struct Services<'a> {
pub(crate) appservice: appservice::Service,
pub(crate) pusher: pusher::Service,
pub(crate) rooms: rooms::Service,
pub(crate) transaction_ids: transaction_ids::Service,
pub(crate) uiaa: uiaa::Service,
pub(crate) users: users::Service,
pub(crate) account_data: account_data::Service,
pub(crate) presence: Arc<presence::Service>,
pub(crate) admin: Arc<admin::Service>,
pub(crate) globals: globals::Service<'a>,
pub(crate) key_backups: key_backups::Service,
pub(crate) media: media::Service,
pub(crate) sending: Arc<sending::Service>,
}
2022-10-05 12:45:54 +02:00
impl Services<'_> {
#[allow(clippy::as_conversions, clippy::cast_sign_loss, clippy::cast_possible_truncation)]
pub(crate) fn build<
2022-10-05 18:36:12 +02:00
D: appservice::Data
+ pusher::Data
+ rooms::Data
+ transaction_ids::Data
+ uiaa::Data
+ users::Data
+ account_data::Data
+ presence::Data
2022-10-05 18:36:12 +02:00
+ globals::Data
+ key_backups::Data
2022-10-08 13:02:52 +02:00
+ media::Data
+ sending::Data
2022-10-08 13:03:07 +02:00
+ 'static,
2022-10-05 18:36:12 +02:00
>(
db: &'static D, config: &Config, tracing_reload_handle: LogLevelReloadHandles,
2022-10-05 18:36:12 +02:00
) -> Result<Self> {
Ok(Self {
appservice: appservice::Service::build(db)?,
2022-10-08 13:02:52 +02:00
pusher: pusher::Service {
db,
},
2022-10-05 18:36:12 +02:00
rooms: rooms::Service {
2022-10-08 13:02:52 +02:00
alias: rooms::alias::Service {
db,
},
auth_chain: rooms::auth_chain::Service {
db,
},
directory: rooms::directory::Service {
db,
},
2022-10-05 18:36:12 +02:00
event_handler: rooms::event_handler::Service,
lazy_loading: rooms::lazy_loading::Service {
2022-10-08 13:02:52 +02:00
db,
2022-10-05 18:36:12 +02:00
lazy_load_waiting: Mutex::new(HashMap::new()),
},
2022-10-08 13:02:52 +02:00
metadata: rooms::metadata::Service {
db,
},
outlier: rooms::outlier::Service {
db,
},
pdu_metadata: rooms::pdu_metadata::Service {
db,
},
read_receipt: rooms::read_receipt::Service {
db,
},
2022-10-08 13:02:52 +02:00
search: rooms::search::Service {
db,
},
short: rooms::short::Service {
db,
},
state: rooms::state::Service {
db,
},
state_accessor: rooms::state_accessor::Service {
db,
server_visibility_cache: StdMutex::new(LruCache::new(
(f64::from(config.server_visibility_cache_capacity) * config.conduit_cache_capacity_modifier)
as usize,
2023-02-22 15:49:55 +01:00
)),
user_visibility_cache: StdMutex::new(LruCache::new(
(f64::from(config.user_visibility_cache_capacity) * config.conduit_cache_capacity_modifier)
as usize,
)),
2022-10-08 13:02:52 +02:00
},
state_cache: rooms::state_cache::Service {
db,
},
2022-10-05 20:34:31 +02:00
state_compressor: rooms::state_compressor::Service {
2022-10-08 13:02:52 +02:00
db,
stateinfo_cache: StdMutex::new(LruCache::new(
(f64::from(config.stateinfo_cache_capacity) * config.conduit_cache_capacity_modifier) as usize,
2022-10-05 20:34:31 +02:00
)),
},
timeline: rooms::timeline::Service {
2022-10-08 13:02:52 +02:00
db,
2022-10-05 20:34:31 +02:00
lasttimelinecount_cache: Mutex::new(HashMap::new()),
},
2023-06-25 19:31:40 +02:00
threads: rooms::threads::Service {
db,
},
typing: rooms::typing::Service {
typing: RwLock::new(BTreeMap::new()),
last_typing_update: RwLock::new(BTreeMap::new()),
typing_update_sender: broadcast::channel(100).0,
},
2023-07-02 16:06:54 +02:00
spaces: rooms::spaces::Service {
roomid_spacehierarchy_cache: Mutex::new(LruCache::new(
(f64::from(config.roomid_spacehierarchy_cache_capacity)
* config.conduit_cache_capacity_modifier) as usize,
)),
2023-07-02 16:06:54 +02:00
},
2022-10-08 13:02:52 +02:00
user: rooms::user::Service {
db,
},
2022-10-05 18:36:12 +02:00
},
2022-10-08 13:02:52 +02:00
transaction_ids: transaction_ids::Service {
db,
},
uiaa: uiaa::Service {
db,
},
2023-07-23 21:57:11 +02:00
users: users::Service {
db,
connections: StdMutex::new(BTreeMap::new()),
2023-07-23 21:57:11 +02:00
},
2022-10-08 13:02:52 +02:00
account_data: account_data::Service {
db,
},
presence: presence::Service::build(db, config),
2022-10-08 13:02:52 +02:00
admin: admin::Service::build(),
key_backups: key_backups::Service {
db,
},
media: media::Service {
db,
url_preview_mutex: RwLock::new(HashMap::new()),
},
sending: sending::Service::build(db, config),
2022-10-08 13:02:52 +02:00
globals: globals::Service::load(db, config, tracing_reload_handle)?,
})
}
async fn memory_usage(&self) -> String {
let lazy_load_waiting = self.rooms.lazy_loading.lazy_load_waiting.lock().await.len();
let server_visibility_cache = self
.rooms
.state_accessor
.server_visibility_cache
.lock()
.unwrap()
.len();
let user_visibility_cache = self
.rooms
.state_accessor
.user_visibility_cache
.lock()
.unwrap()
.len();
let stateinfo_cache = self
.rooms
.state_compressor
.stateinfo_cache
.lock()
.unwrap()
.len();
let lasttimelinecount_cache = self
.rooms
.timeline
.lasttimelinecount_cache
.lock()
.await
.len();
let roomid_spacehierarchy_cache = self
.rooms
.spaces
.roomid_spacehierarchy_cache
.lock()
.await
.len();
let resolver_overrides_cache = self.globals.resolver.overrides.read().unwrap().len();
let resolver_destinations_cache = self.globals.resolver.destinations.read().await.len();
let bad_event_ratelimiter = self.globals.bad_event_ratelimiter.read().await.len();
let bad_query_ratelimiter = self.globals.bad_query_ratelimiter.read().await.len();
let bad_signature_ratelimiter = self.globals.bad_signature_ratelimiter.read().await.len();
format!(
"\
lazy_load_waiting: {lazy_load_waiting}
server_visibility_cache: {server_visibility_cache}
user_visibility_cache: {user_visibility_cache}
stateinfo_cache: {stateinfo_cache}
lasttimelinecount_cache: {lasttimelinecount_cache}
roomid_spacehierarchy_cache: {roomid_spacehierarchy_cache}
resolver_overrides_cache: {resolver_overrides_cache}
resolver_destinations_cache: {resolver_destinations_cache}
bad_event_ratelimiter: {bad_event_ratelimiter}
bad_query_ratelimiter: {bad_query_ratelimiter}
bad_signature_ratelimiter: {bad_signature_ratelimiter}
"
)
}
async fn clear_caches(&self, amount: u32) {
if amount > 0 {
self.rooms
.lazy_loading
.lazy_load_waiting
.lock()
.await
.clear();
}
if amount > 1 {
self.rooms
.state_accessor
.server_visibility_cache
.lock()
.unwrap()
.clear();
}
if amount > 2 {
self.rooms
.state_accessor
.user_visibility_cache
.lock()
.unwrap()
.clear();
}
if amount > 3 {
self.rooms
.state_compressor
.stateinfo_cache
.lock()
.unwrap()
.clear();
}
if amount > 4 {
self.rooms
.timeline
.lasttimelinecount_cache
.lock()
.await
.clear();
}
if amount > 5 {
self.rooms
.spaces
.roomid_spacehierarchy_cache
.lock()
.await
.clear();
}
if amount > 6 {
self.globals.resolver.overrides.write().unwrap().clear();
self.globals.resolver.destinations.write().await.clear();
}
if amount > 7 {
self.globals.resolver.resolver.clear_cache();
}
if amount > 8 {
self.globals.bad_event_ratelimiter.write().await.clear();
}
if amount > 9 {
self.globals.bad_query_ratelimiter.write().await.clear();
}
if amount > 10 {
self.globals.bad_signature_ratelimiter.write().await.clear();
}
}
2022-10-05 12:45:54 +02:00
}