|
|
|
|
@ -1,21 +1,15 @@
@@ -1,21 +1,15 @@
|
|
|
|
|
pub mod abstraction; |
|
|
|
|
|
|
|
|
|
pub mod account_data; |
|
|
|
|
pub mod admin; |
|
|
|
|
pub mod appservice; |
|
|
|
|
pub mod globals; |
|
|
|
|
pub mod key_backups; |
|
|
|
|
pub mod media; |
|
|
|
|
pub mod proxy; |
|
|
|
|
pub mod pusher; |
|
|
|
|
pub mod rooms; |
|
|
|
|
pub mod sending; |
|
|
|
|
pub mod transaction_ids; |
|
|
|
|
pub mod uiaa; |
|
|
|
|
pub mod users; |
|
|
|
|
use std::hash::Hash; |
|
|
|
|
use std::{ |
|
|
|
|
collections::{BTreeMap, HashMap, HashSet}, |
|
|
|
|
convert::{TryFrom, TryInto}, |
|
|
|
|
fs::{self, remove_dir_all}, |
|
|
|
|
io::Write, |
|
|
|
|
mem::size_of, |
|
|
|
|
ops::Deref, |
|
|
|
|
path::Path, |
|
|
|
|
sync::{Arc, Mutex, RwLock}, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
use crate::{utils, Error, Result}; |
|
|
|
|
use abstraction::DatabaseEngine; |
|
|
|
|
use directories::ProjectDirs; |
|
|
|
|
use lru_cache::LruCache; |
|
|
|
|
use rocket::{ |
|
|
|
|
@ -26,21 +20,31 @@ use rocket::{
@@ -26,21 +20,31 @@ use rocket::{
|
|
|
|
|
}; |
|
|
|
|
use ruma::{DeviceId, EventId, RoomId, ServerName, UserId}; |
|
|
|
|
use serde::{de::IgnoredAny, Deserialize}; |
|
|
|
|
use std::{ |
|
|
|
|
collections::{BTreeMap, HashMap, HashSet}, |
|
|
|
|
convert::{TryFrom, TryInto}, |
|
|
|
|
fs::{self, remove_dir_all}, |
|
|
|
|
io::Write, |
|
|
|
|
mem::size_of, |
|
|
|
|
ops::Deref, |
|
|
|
|
path::Path, |
|
|
|
|
sync::{Arc, Mutex, RwLock}, |
|
|
|
|
}; |
|
|
|
|
use tokio::sync::{OwnedRwLockReadGuard, RwLock as TokioRwLock, Semaphore}; |
|
|
|
|
use tracing::{debug, error, warn}; |
|
|
|
|
|
|
|
|
|
use abstraction::DatabaseEngine; |
|
|
|
|
|
|
|
|
|
use crate::{utils, Error, Result}; |
|
|
|
|
|
|
|
|
|
use self::proxy::ProxyConfig; |
|
|
|
|
|
|
|
|
|
pub mod abstraction; |
|
|
|
|
|
|
|
|
|
pub mod account_data; |
|
|
|
|
pub mod admin; |
|
|
|
|
pub mod appservice; |
|
|
|
|
pub mod globals; |
|
|
|
|
pub mod key_backups; |
|
|
|
|
pub mod media; |
|
|
|
|
pub mod proxy; |
|
|
|
|
pub mod pusher; |
|
|
|
|
pub mod rooms; |
|
|
|
|
pub mod sending; |
|
|
|
|
pub mod transaction_ids; |
|
|
|
|
pub mod uiaa; |
|
|
|
|
pub mod users; |
|
|
|
|
|
|
|
|
|
#[derive(Clone, Debug, Deserialize)] |
|
|
|
|
pub struct Config { |
|
|
|
|
server_name: Box<ServerName>, |
|
|
|
|
@ -132,6 +136,17 @@ pub type Engine = abstraction::sqlite::Engine;
@@ -132,6 +136,17 @@ pub type Engine = abstraction::sqlite::Engine;
|
|
|
|
|
#[cfg(feature = "heed")] |
|
|
|
|
pub type Engine = abstraction::heed::Engine; |
|
|
|
|
|
|
|
|
|
// for each key: (memory_usage in bytes, items in cache, capacity)
|
|
|
|
|
pub struct CacheUsageStatistics { |
|
|
|
|
pdu_cache: (usize, usize, usize), |
|
|
|
|
auth_chain_cache: (usize, usize, usize), |
|
|
|
|
shorteventid_cache: (usize, usize, usize), |
|
|
|
|
eventidshort_cache: (usize, usize, usize), |
|
|
|
|
statekeyshort_cache: (usize, usize, usize), |
|
|
|
|
shortstatekey_cache: (usize, usize, usize), |
|
|
|
|
stateinfo_cache: (usize, usize, usize), |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pub struct Database { |
|
|
|
|
_db: Arc<Engine>, |
|
|
|
|
pub globals: globals::Globals, |
|
|
|
|
@ -917,6 +932,66 @@ impl Database {
@@ -917,6 +932,66 @@ impl Database {
|
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// Measures memory usage in bytes and how full the caches are in percent for all caches in the Database struct.
|
|
|
|
|
pub fn get_cache_usage(&mut self) -> Result<CacheUsageStatistics> { |
|
|
|
|
fn memory_usage_of_locked_cache<K: Eq + Hash, V>( |
|
|
|
|
cache: &mut Mutex<LruCache<K, V>>, |
|
|
|
|
) -> usize { |
|
|
|
|
let raw_cache = cache.lock().unwrap(); |
|
|
|
|
let mut cache_items_size_sum: usize = 0; |
|
|
|
|
for cache_item in raw_cache.iter() { |
|
|
|
|
cache_items_size_sum += std::mem::size_of_val(&cache_item); |
|
|
|
|
} |
|
|
|
|
cache_items_size_sum += std::mem::size_of_val(&cache); |
|
|
|
|
cache_items_size_sum |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn items_in_locked_cache<K: Eq + Hash, V>(cache: &mut Mutex<LruCache<K, V>>) -> usize { |
|
|
|
|
cache.lock().unwrap().len() |
|
|
|
|
} |
|
|
|
|
fn capacity_of_locked_cache<K: Eq + Hash, V>(cache: &mut Mutex<LruCache<K, V>>) -> usize { |
|
|
|
|
cache.lock().unwrap().capacity() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return Ok(CacheUsageStatistics { |
|
|
|
|
pdu_cache: ( |
|
|
|
|
memory_usage_of_locked_cache(&mut self.rooms.pdu_cache), |
|
|
|
|
items_in_locked_cache(&mut self.rooms.pdu_cache), |
|
|
|
|
capacity_of_locked_cache(&mut self.rooms.pdu_cache), |
|
|
|
|
), |
|
|
|
|
auth_chain_cache: ( |
|
|
|
|
memory_usage_of_locked_cache(&mut self.rooms.auth_chain_cache), |
|
|
|
|
items_in_locked_cache(&mut self.rooms.auth_chain_cache), |
|
|
|
|
capacity_of_locked_cache(&mut self.rooms.auth_chain_cache), |
|
|
|
|
), |
|
|
|
|
shorteventid_cache: ( |
|
|
|
|
memory_usage_of_locked_cache(&mut self.rooms.shorteventid_cache), |
|
|
|
|
items_in_locked_cache(&mut self.rooms.shorteventid_cache), |
|
|
|
|
capacity_of_locked_cache(&mut self.rooms.shorteventid_cache), |
|
|
|
|
), |
|
|
|
|
eventidshort_cache: ( |
|
|
|
|
memory_usage_of_locked_cache(&mut self.rooms.eventidshort_cache), |
|
|
|
|
items_in_locked_cache(&mut self.rooms.eventidshort_cache), |
|
|
|
|
capacity_of_locked_cache(&mut self.rooms.eventidshort_cache), |
|
|
|
|
), |
|
|
|
|
statekeyshort_cache: ( |
|
|
|
|
memory_usage_of_locked_cache(&mut self.rooms.statekeyshort_cache), |
|
|
|
|
items_in_locked_cache(&mut self.rooms.statekeyshort_cache), |
|
|
|
|
capacity_of_locked_cache(&mut self.rooms.statekeyshort_cache), |
|
|
|
|
), |
|
|
|
|
shortstatekey_cache: ( |
|
|
|
|
memory_usage_of_locked_cache(&mut self.rooms.shortstatekey_cache), |
|
|
|
|
items_in_locked_cache(&mut self.rooms.shortstatekey_cache), |
|
|
|
|
capacity_of_locked_cache(&mut self.rooms.shortstatekey_cache), |
|
|
|
|
), |
|
|
|
|
stateinfo_cache: ( |
|
|
|
|
memory_usage_of_locked_cache(&mut self.rooms.stateinfo_cache), |
|
|
|
|
items_in_locked_cache(&mut self.rooms.stateinfo_cache), |
|
|
|
|
capacity_of_locked_cache(&mut self.rooms.stateinfo_cache), |
|
|
|
|
), |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pub struct DatabaseGuard(OwnedRwLockReadGuard<Database>); |
|
|
|
|
|