|
|
|
@ -1,8 +1,16 @@
|
|
|
|
|
pub mod abstraction;
|
|
|
|
|
pub mod key_value;
|
|
|
|
|
|
|
|
|
|
use crate::{utils, Config, Error, Result, service::{users, globals, uiaa, rooms::{self, state_compressor::CompressedStateEvent}, account_data, media, key_backups, transaction_ids, sending, appservice, pusher}, services, PduEvent, Services, SERVICES};
|
|
|
|
|
use crate::{
|
|
|
|
|
service::{
|
|
|
|
|
account_data, appservice, globals, key_backups, media, pusher,
|
|
|
|
|
rooms::{self, state_compressor::CompressedStateEvent},
|
|
|
|
|
sending, transaction_ids, uiaa, users,
|
|
|
|
|
},
|
|
|
|
|
services, utils, Config, Error, PduEvent, Result, Services, SERVICES,
|
|
|
|
|
};
|
|
|
|
|
use abstraction::KeyValueDatabaseEngine;
|
|
|
|
|
use abstraction::KvTree;
|
|
|
|
|
use directories::ProjectDirs;
|
|
|
|
|
use futures_util::{stream::FuturesUnordered, StreamExt};
|
|
|
|
|
use lru_cache::LruCache;
|
|
|
|
@ -12,7 +20,8 @@ use ruma::{
|
|
|
|
|
GlobalAccountDataEvent, GlobalAccountDataEventType, StateEventType,
|
|
|
|
|
},
|
|
|
|
|
push::Ruleset,
|
|
|
|
|
DeviceId, EventId, RoomId, UserId, signatures::CanonicalJsonValue,
|
|
|
|
|
signatures::CanonicalJsonValue,
|
|
|
|
|
DeviceId, EventId, RoomId, UserId,
|
|
|
|
|
};
|
|
|
|
|
use std::{
|
|
|
|
|
collections::{BTreeMap, HashMap, HashSet},
|
|
|
|
@ -25,7 +34,6 @@ use std::{
|
|
|
|
|
};
|
|
|
|
|
use tokio::sync::{mpsc, OwnedRwLockReadGuard, RwLock as TokioRwLock, Semaphore};
|
|
|
|
|
use tracing::{debug, error, info, warn};
|
|
|
|
|
use abstraction::KvTree;
|
|
|
|
|
|
|
|
|
|
pub struct KeyValueDatabase {
|
|
|
|
|
_db: Arc<dyn KeyValueDatabaseEngine>,
|
|
|
|
@ -65,9 +73,9 @@ pub struct KeyValueDatabase {
|
|
|
|
|
pub(super) readreceiptid_readreceipt: Arc<dyn KvTree>, // ReadReceiptId = RoomId + Count + UserId
|
|
|
|
|
pub(super) roomuserid_privateread: Arc<dyn KvTree>, // RoomUserId = Room + User, PrivateRead = Count
|
|
|
|
|
pub(super) roomuserid_lastprivatereadupdate: Arc<dyn KvTree>, // LastPrivateReadUpdate = Count
|
|
|
|
|
pub(super) typingid_userid: Arc<dyn KvTree>, // TypingId = RoomId + TimeoutTime + Count
|
|
|
|
|
pub(super) typingid_userid: Arc<dyn KvTree>, // TypingId = RoomId + TimeoutTime + Count
|
|
|
|
|
pub(super) roomid_lasttypingupdate: Arc<dyn KvTree>, // LastRoomTypingUpdate = Count
|
|
|
|
|
pub(super) presenceid_presence: Arc<dyn KvTree>, // PresenceId = RoomId + Count + UserId
|
|
|
|
|
pub(super) presenceid_presence: Arc<dyn KvTree>, // PresenceId = RoomId + Count + UserId
|
|
|
|
|
pub(super) userid_lastpresenceupdate: Arc<dyn KvTree>, // LastPresenceUpdate = Count
|
|
|
|
|
|
|
|
|
|
//pub rooms: rooms::Rooms,
|
|
|
|
@ -279,127 +287,126 @@ impl KeyValueDatabase {
|
|
|
|
|
|
|
|
|
|
let db = Arc::new(Self {
|
|
|
|
|
_db: builder.clone(),
|
|
|
|
|
userid_password: builder.open_tree("userid_password")?,
|
|
|
|
|
userid_displayname: builder.open_tree("userid_displayname")?,
|
|
|
|
|
userid_avatarurl: builder.open_tree("userid_avatarurl")?,
|
|
|
|
|
userid_blurhash: builder.open_tree("userid_blurhash")?,
|
|
|
|
|
userdeviceid_token: builder.open_tree("userdeviceid_token")?,
|
|
|
|
|
userdeviceid_metadata: builder.open_tree("userdeviceid_metadata")?,
|
|
|
|
|
userid_devicelistversion: builder.open_tree("userid_devicelistversion")?,
|
|
|
|
|
token_userdeviceid: builder.open_tree("token_userdeviceid")?,
|
|
|
|
|
onetimekeyid_onetimekeys: builder.open_tree("onetimekeyid_onetimekeys")?,
|
|
|
|
|
userid_lastonetimekeyupdate: builder.open_tree("userid_lastonetimekeyupdate")?,
|
|
|
|
|
keychangeid_userid: builder.open_tree("keychangeid_userid")?,
|
|
|
|
|
keyid_key: builder.open_tree("keyid_key")?,
|
|
|
|
|
userid_masterkeyid: builder.open_tree("userid_masterkeyid")?,
|
|
|
|
|
userid_selfsigningkeyid: builder.open_tree("userid_selfsigningkeyid")?,
|
|
|
|
|
userid_usersigningkeyid: builder.open_tree("userid_usersigningkeyid")?,
|
|
|
|
|
userfilterid_filter: builder.open_tree("userfilterid_filter")?,
|
|
|
|
|
todeviceid_events: builder.open_tree("todeviceid_events")?,
|
|
|
|
|
|
|
|
|
|
userdevicesessionid_uiaainfo: builder.open_tree("userdevicesessionid_uiaainfo")?,
|
|
|
|
|
userdevicesessionid_uiaarequest: RwLock::new(BTreeMap::new()),
|
|
|
|
|
readreceiptid_readreceipt: builder.open_tree("readreceiptid_readreceipt")?,
|
|
|
|
|
roomuserid_privateread: builder.open_tree("roomuserid_privateread")?, // "Private" read receipt
|
|
|
|
|
roomuserid_lastprivatereadupdate: builder
|
|
|
|
|
.open_tree("roomuserid_lastprivatereadupdate")?,
|
|
|
|
|
typingid_userid: builder.open_tree("typingid_userid")?,
|
|
|
|
|
roomid_lasttypingupdate: builder.open_tree("roomid_lasttypingupdate")?,
|
|
|
|
|
presenceid_presence: builder.open_tree("presenceid_presence")?,
|
|
|
|
|
userid_lastpresenceupdate: builder.open_tree("userid_lastpresenceupdate")?,
|
|
|
|
|
pduid_pdu: builder.open_tree("pduid_pdu")?,
|
|
|
|
|
eventid_pduid: builder.open_tree("eventid_pduid")?,
|
|
|
|
|
roomid_pduleaves: builder.open_tree("roomid_pduleaves")?,
|
|
|
|
|
|
|
|
|
|
alias_roomid: builder.open_tree("alias_roomid")?,
|
|
|
|
|
aliasid_alias: builder.open_tree("aliasid_alias")?,
|
|
|
|
|
publicroomids: builder.open_tree("publicroomids")?,
|
|
|
|
|
|
|
|
|
|
tokenids: builder.open_tree("tokenids")?,
|
|
|
|
|
|
|
|
|
|
roomserverids: builder.open_tree("roomserverids")?,
|
|
|
|
|
serverroomids: builder.open_tree("serverroomids")?,
|
|
|
|
|
userroomid_joined: builder.open_tree("userroomid_joined")?,
|
|
|
|
|
roomuserid_joined: builder.open_tree("roomuserid_joined")?,
|
|
|
|
|
roomid_joinedcount: builder.open_tree("roomid_joinedcount")?,
|
|
|
|
|
roomid_invitedcount: builder.open_tree("roomid_invitedcount")?,
|
|
|
|
|
roomuseroncejoinedids: builder.open_tree("roomuseroncejoinedids")?,
|
|
|
|
|
userroomid_invitestate: builder.open_tree("userroomid_invitestate")?,
|
|
|
|
|
roomuserid_invitecount: builder.open_tree("roomuserid_invitecount")?,
|
|
|
|
|
userroomid_leftstate: builder.open_tree("userroomid_leftstate")?,
|
|
|
|
|
roomuserid_leftcount: builder.open_tree("roomuserid_leftcount")?,
|
|
|
|
|
|
|
|
|
|
disabledroomids: builder.open_tree("disabledroomids")?,
|
|
|
|
|
|
|
|
|
|
lazyloadedids: builder.open_tree("lazyloadedids")?,
|
|
|
|
|
|
|
|
|
|
userroomid_notificationcount: builder.open_tree("userroomid_notificationcount")?,
|
|
|
|
|
userroomid_highlightcount: builder.open_tree("userroomid_highlightcount")?,
|
|
|
|
|
|
|
|
|
|
statekey_shortstatekey: builder.open_tree("statekey_shortstatekey")?,
|
|
|
|
|
shortstatekey_statekey: builder.open_tree("shortstatekey_statekey")?,
|
|
|
|
|
|
|
|
|
|
shorteventid_authchain: builder.open_tree("shorteventid_authchain")?,
|
|
|
|
|
|
|
|
|
|
roomid_shortroomid: builder.open_tree("roomid_shortroomid")?,
|
|
|
|
|
|
|
|
|
|
shortstatehash_statediff: builder.open_tree("shortstatehash_statediff")?,
|
|
|
|
|
eventid_shorteventid: builder.open_tree("eventid_shorteventid")?,
|
|
|
|
|
shorteventid_eventid: builder.open_tree("shorteventid_eventid")?,
|
|
|
|
|
shorteventid_shortstatehash: builder.open_tree("shorteventid_shortstatehash")?,
|
|
|
|
|
roomid_shortstatehash: builder.open_tree("roomid_shortstatehash")?,
|
|
|
|
|
roomsynctoken_shortstatehash: builder.open_tree("roomsynctoken_shortstatehash")?,
|
|
|
|
|
statehash_shortstatehash: builder.open_tree("statehash_shortstatehash")?,
|
|
|
|
|
|
|
|
|
|
eventid_outlierpdu: builder.open_tree("eventid_outlierpdu")?,
|
|
|
|
|
softfailedeventids: builder.open_tree("softfailedeventids")?,
|
|
|
|
|
|
|
|
|
|
referencedevents: builder.open_tree("referencedevents")?,
|
|
|
|
|
roomuserdataid_accountdata: builder.open_tree("roomuserdataid_accountdata")?,
|
|
|
|
|
roomusertype_roomuserdataid: builder.open_tree("roomusertype_roomuserdataid")?,
|
|
|
|
|
mediaid_file: builder.open_tree("mediaid_file")?,
|
|
|
|
|
backupid_algorithm: builder.open_tree("backupid_algorithm")?,
|
|
|
|
|
backupid_etag: builder.open_tree("backupid_etag")?,
|
|
|
|
|
backupkeyid_backup: builder.open_tree("backupkeyid_backup")?,
|
|
|
|
|
userdevicetxnid_response: builder.open_tree("userdevicetxnid_response")?,
|
|
|
|
|
servername_educount: builder.open_tree("servername_educount")?,
|
|
|
|
|
servernameevent_data: builder.open_tree("servernameevent_data")?,
|
|
|
|
|
servercurrentevent_data: builder.open_tree("servercurrentevent_data")?,
|
|
|
|
|
id_appserviceregistrations: builder.open_tree("id_appserviceregistrations")?,
|
|
|
|
|
senderkey_pusher: builder.open_tree("senderkey_pusher")?,
|
|
|
|
|
global: builder.open_tree("global")?,
|
|
|
|
|
server_signingkeys: builder.open_tree("server_signingkeys")?,
|
|
|
|
|
|
|
|
|
|
cached_registrations: Arc::new(RwLock::new(HashMap::new())),
|
|
|
|
|
pdu_cache: Mutex::new(LruCache::new(
|
|
|
|
|
config
|
|
|
|
|
.pdu_cache_capacity
|
|
|
|
|
.try_into()
|
|
|
|
|
.expect("pdu cache capacity fits into usize"),
|
|
|
|
|
)),
|
|
|
|
|
auth_chain_cache: Mutex::new(LruCache::new(
|
|
|
|
|
(100_000.0 * config.conduit_cache_capacity_modifier) as usize,
|
|
|
|
|
)),
|
|
|
|
|
shorteventid_cache: Mutex::new(LruCache::new(
|
|
|
|
|
(100_000.0 * config.conduit_cache_capacity_modifier) as usize,
|
|
|
|
|
)),
|
|
|
|
|
eventidshort_cache: Mutex::new(LruCache::new(
|
|
|
|
|
(100_000.0 * config.conduit_cache_capacity_modifier) as usize,
|
|
|
|
|
)),
|
|
|
|
|
shortstatekey_cache: Mutex::new(LruCache::new(
|
|
|
|
|
(100_000.0 * config.conduit_cache_capacity_modifier) as usize,
|
|
|
|
|
)),
|
|
|
|
|
statekeyshort_cache: Mutex::new(LruCache::new(
|
|
|
|
|
(100_000.0 * config.conduit_cache_capacity_modifier) as usize,
|
|
|
|
|
)),
|
|
|
|
|
our_real_users_cache: RwLock::new(HashMap::new()),
|
|
|
|
|
appservice_in_room_cache: RwLock::new(HashMap::new()),
|
|
|
|
|
lazy_load_waiting: Mutex::new(HashMap::new()),
|
|
|
|
|
stateinfo_cache: Mutex::new(LruCache::new(
|
|
|
|
|
(100.0 * config.conduit_cache_capacity_modifier) as usize,
|
|
|
|
|
)),
|
|
|
|
|
lasttimelinecount_cache: Mutex::new(HashMap::new()),
|
|
|
|
|
|
|
|
|
|
userid_password: builder.open_tree("userid_password")?,
|
|
|
|
|
userid_displayname: builder.open_tree("userid_displayname")?,
|
|
|
|
|
userid_avatarurl: builder.open_tree("userid_avatarurl")?,
|
|
|
|
|
userid_blurhash: builder.open_tree("userid_blurhash")?,
|
|
|
|
|
userdeviceid_token: builder.open_tree("userdeviceid_token")?,
|
|
|
|
|
userdeviceid_metadata: builder.open_tree("userdeviceid_metadata")?,
|
|
|
|
|
userid_devicelistversion: builder.open_tree("userid_devicelistversion")?,
|
|
|
|
|
token_userdeviceid: builder.open_tree("token_userdeviceid")?,
|
|
|
|
|
onetimekeyid_onetimekeys: builder.open_tree("onetimekeyid_onetimekeys")?,
|
|
|
|
|
userid_lastonetimekeyupdate: builder.open_tree("userid_lastonetimekeyupdate")?,
|
|
|
|
|
keychangeid_userid: builder.open_tree("keychangeid_userid")?,
|
|
|
|
|
keyid_key: builder.open_tree("keyid_key")?,
|
|
|
|
|
userid_masterkeyid: builder.open_tree("userid_masterkeyid")?,
|
|
|
|
|
userid_selfsigningkeyid: builder.open_tree("userid_selfsigningkeyid")?,
|
|
|
|
|
userid_usersigningkeyid: builder.open_tree("userid_usersigningkeyid")?,
|
|
|
|
|
userfilterid_filter: builder.open_tree("userfilterid_filter")?,
|
|
|
|
|
todeviceid_events: builder.open_tree("todeviceid_events")?,
|
|
|
|
|
|
|
|
|
|
userdevicesessionid_uiaainfo: builder.open_tree("userdevicesessionid_uiaainfo")?,
|
|
|
|
|
userdevicesessionid_uiaarequest: RwLock::new(BTreeMap::new()),
|
|
|
|
|
readreceiptid_readreceipt: builder.open_tree("readreceiptid_readreceipt")?,
|
|
|
|
|
roomuserid_privateread: builder.open_tree("roomuserid_privateread")?, // "Private" read receipt
|
|
|
|
|
roomuserid_lastprivatereadupdate: builder
|
|
|
|
|
.open_tree("roomuserid_lastprivatereadupdate")?,
|
|
|
|
|
typingid_userid: builder.open_tree("typingid_userid")?,
|
|
|
|
|
roomid_lasttypingupdate: builder.open_tree("roomid_lasttypingupdate")?,
|
|
|
|
|
presenceid_presence: builder.open_tree("presenceid_presence")?,
|
|
|
|
|
userid_lastpresenceupdate: builder.open_tree("userid_lastpresenceupdate")?,
|
|
|
|
|
pduid_pdu: builder.open_tree("pduid_pdu")?,
|
|
|
|
|
eventid_pduid: builder.open_tree("eventid_pduid")?,
|
|
|
|
|
roomid_pduleaves: builder.open_tree("roomid_pduleaves")?,
|
|
|
|
|
|
|
|
|
|
alias_roomid: builder.open_tree("alias_roomid")?,
|
|
|
|
|
aliasid_alias: builder.open_tree("aliasid_alias")?,
|
|
|
|
|
publicroomids: builder.open_tree("publicroomids")?,
|
|
|
|
|
|
|
|
|
|
tokenids: builder.open_tree("tokenids")?,
|
|
|
|
|
|
|
|
|
|
roomserverids: builder.open_tree("roomserverids")?,
|
|
|
|
|
serverroomids: builder.open_tree("serverroomids")?,
|
|
|
|
|
userroomid_joined: builder.open_tree("userroomid_joined")?,
|
|
|
|
|
roomuserid_joined: builder.open_tree("roomuserid_joined")?,
|
|
|
|
|
roomid_joinedcount: builder.open_tree("roomid_joinedcount")?,
|
|
|
|
|
roomid_invitedcount: builder.open_tree("roomid_invitedcount")?,
|
|
|
|
|
roomuseroncejoinedids: builder.open_tree("roomuseroncejoinedids")?,
|
|
|
|
|
userroomid_invitestate: builder.open_tree("userroomid_invitestate")?,
|
|
|
|
|
roomuserid_invitecount: builder.open_tree("roomuserid_invitecount")?,
|
|
|
|
|
userroomid_leftstate: builder.open_tree("userroomid_leftstate")?,
|
|
|
|
|
roomuserid_leftcount: builder.open_tree("roomuserid_leftcount")?,
|
|
|
|
|
|
|
|
|
|
disabledroomids: builder.open_tree("disabledroomids")?,
|
|
|
|
|
|
|
|
|
|
lazyloadedids: builder.open_tree("lazyloadedids")?,
|
|
|
|
|
|
|
|
|
|
userroomid_notificationcount: builder.open_tree("userroomid_notificationcount")?,
|
|
|
|
|
userroomid_highlightcount: builder.open_tree("userroomid_highlightcount")?,
|
|
|
|
|
|
|
|
|
|
statekey_shortstatekey: builder.open_tree("statekey_shortstatekey")?,
|
|
|
|
|
shortstatekey_statekey: builder.open_tree("shortstatekey_statekey")?,
|
|
|
|
|
|
|
|
|
|
shorteventid_authchain: builder.open_tree("shorteventid_authchain")?,
|
|
|
|
|
|
|
|
|
|
roomid_shortroomid: builder.open_tree("roomid_shortroomid")?,
|
|
|
|
|
|
|
|
|
|
shortstatehash_statediff: builder.open_tree("shortstatehash_statediff")?,
|
|
|
|
|
eventid_shorteventid: builder.open_tree("eventid_shorteventid")?,
|
|
|
|
|
shorteventid_eventid: builder.open_tree("shorteventid_eventid")?,
|
|
|
|
|
shorteventid_shortstatehash: builder.open_tree("shorteventid_shortstatehash")?,
|
|
|
|
|
roomid_shortstatehash: builder.open_tree("roomid_shortstatehash")?,
|
|
|
|
|
roomsynctoken_shortstatehash: builder.open_tree("roomsynctoken_shortstatehash")?,
|
|
|
|
|
statehash_shortstatehash: builder.open_tree("statehash_shortstatehash")?,
|
|
|
|
|
|
|
|
|
|
eventid_outlierpdu: builder.open_tree("eventid_outlierpdu")?,
|
|
|
|
|
softfailedeventids: builder.open_tree("softfailedeventids")?,
|
|
|
|
|
|
|
|
|
|
referencedevents: builder.open_tree("referencedevents")?,
|
|
|
|
|
roomuserdataid_accountdata: builder.open_tree("roomuserdataid_accountdata")?,
|
|
|
|
|
roomusertype_roomuserdataid: builder.open_tree("roomusertype_roomuserdataid")?,
|
|
|
|
|
mediaid_file: builder.open_tree("mediaid_file")?,
|
|
|
|
|
backupid_algorithm: builder.open_tree("backupid_algorithm")?,
|
|
|
|
|
backupid_etag: builder.open_tree("backupid_etag")?,
|
|
|
|
|
backupkeyid_backup: builder.open_tree("backupkeyid_backup")?,
|
|
|
|
|
userdevicetxnid_response: builder.open_tree("userdevicetxnid_response")?,
|
|
|
|
|
servername_educount: builder.open_tree("servername_educount")?,
|
|
|
|
|
servernameevent_data: builder.open_tree("servernameevent_data")?,
|
|
|
|
|
servercurrentevent_data: builder.open_tree("servercurrentevent_data")?,
|
|
|
|
|
id_appserviceregistrations: builder.open_tree("id_appserviceregistrations")?,
|
|
|
|
|
senderkey_pusher: builder.open_tree("senderkey_pusher")?,
|
|
|
|
|
global: builder.open_tree("global")?,
|
|
|
|
|
server_signingkeys: builder.open_tree("server_signingkeys")?,
|
|
|
|
|
|
|
|
|
|
cached_registrations: Arc::new(RwLock::new(HashMap::new())),
|
|
|
|
|
pdu_cache: Mutex::new(LruCache::new(
|
|
|
|
|
config
|
|
|
|
|
.pdu_cache_capacity
|
|
|
|
|
.try_into()
|
|
|
|
|
.expect("pdu cache capacity fits into usize"),
|
|
|
|
|
)),
|
|
|
|
|
auth_chain_cache: Mutex::new(LruCache::new(
|
|
|
|
|
(100_000.0 * config.conduit_cache_capacity_modifier) as usize,
|
|
|
|
|
)),
|
|
|
|
|
shorteventid_cache: Mutex::new(LruCache::new(
|
|
|
|
|
(100_000.0 * config.conduit_cache_capacity_modifier) as usize,
|
|
|
|
|
)),
|
|
|
|
|
eventidshort_cache: Mutex::new(LruCache::new(
|
|
|
|
|
(100_000.0 * config.conduit_cache_capacity_modifier) as usize,
|
|
|
|
|
)),
|
|
|
|
|
shortstatekey_cache: Mutex::new(LruCache::new(
|
|
|
|
|
(100_000.0 * config.conduit_cache_capacity_modifier) as usize,
|
|
|
|
|
)),
|
|
|
|
|
statekeyshort_cache: Mutex::new(LruCache::new(
|
|
|
|
|
(100_000.0 * config.conduit_cache_capacity_modifier) as usize,
|
|
|
|
|
)),
|
|
|
|
|
our_real_users_cache: RwLock::new(HashMap::new()),
|
|
|
|
|
appservice_in_room_cache: RwLock::new(HashMap::new()),
|
|
|
|
|
lazy_load_waiting: Mutex::new(HashMap::new()),
|
|
|
|
|
stateinfo_cache: Mutex::new(LruCache::new(
|
|
|
|
|
(100.0 * config.conduit_cache_capacity_modifier) as usize,
|
|
|
|
|
)),
|
|
|
|
|
lasttimelinecount_cache: Mutex::new(HashMap::new()),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
let services_raw = Box::new(Services::build(Arc::clone(&db), config)?);
|
|
|
|
@ -407,7 +414,6 @@ impl KeyValueDatabase {
|
|
|
|
|
// This is the first and only time we initialize the SERVICE static
|
|
|
|
|
*SERVICES.write().unwrap() = Some(Box::leak(services_raw));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Matrix resource ownership is based on the server name; changing it
|
|
|
|
|
// requires recreating the database from scratch.
|
|
|
|
|
if services().users.count()? > 0 {
|
|
|
|
@ -570,7 +576,10 @@ impl KeyValueDatabase {
|
|
|
|
|
let states_parents = last_roomsstatehash.map_or_else(
|
|
|
|
|
|| Ok(Vec::new()),
|
|
|
|
|
|&last_roomsstatehash| {
|
|
|
|
|
services().rooms.state_compressor.load_shortstatehash_info(dbg!(last_roomsstatehash))
|
|
|
|
|
services()
|
|
|
|
|
.rooms
|
|
|
|
|
.state_compressor
|
|
|
|
|
.load_shortstatehash_info(dbg!(last_roomsstatehash))
|
|
|
|
|
},
|
|
|
|
|
)?;
|
|
|
|
|
|
|
|
|
@ -643,14 +652,15 @@ impl KeyValueDatabase {
|
|
|
|
|
current_state = HashSet::new();
|
|
|
|
|
current_sstatehash = Some(sstatehash);
|
|
|
|
|
|
|
|
|
|
let event_id = db
|
|
|
|
|
.shorteventid_eventid
|
|
|
|
|
.get(&seventid)
|
|
|
|
|
.unwrap()
|
|
|
|
|
.unwrap();
|
|
|
|
|
let event_id = db.shorteventid_eventid.get(&seventid).unwrap().unwrap();
|
|
|
|
|
let string = utils::string_from_bytes(&event_id).unwrap();
|
|
|
|
|
let event_id = <&EventId>::try_from(string.as_str()).unwrap();
|
|
|
|
|
let pdu = services().rooms.timeline.get_pdu(event_id).unwrap().unwrap();
|
|
|
|
|
let pdu = services()
|
|
|
|
|
.rooms
|
|
|
|
|
.timeline
|
|
|
|
|
.get_pdu(event_id)
|
|
|
|
|
.unwrap()
|
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
|
|
if Some(&pdu.room_id) != current_room.as_ref() {
|
|
|
|
|
current_room = Some(pdu.room_id.clone());
|
|
|
|
@ -764,8 +774,7 @@ impl KeyValueDatabase {
|
|
|
|
|
.peekable();
|
|
|
|
|
|
|
|
|
|
while iter.peek().is_some() {
|
|
|
|
|
db.tokenids
|
|
|
|
|
.insert_batch(&mut iter.by_ref().take(1000))?;
|
|
|
|
|
db.tokenids.insert_batch(&mut iter.by_ref().take(1000))?;
|
|
|
|
|
println!("smaller batch done");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -803,8 +812,7 @@ impl KeyValueDatabase {
|
|
|
|
|
|
|
|
|
|
// Force E2EE device list updates so we can send them over federation
|
|
|
|
|
for user_id in services().users.iter().filter_map(|r| r.ok()) {
|
|
|
|
|
services().users
|
|
|
|
|
.mark_device_key_update(&user_id)?;
|
|
|
|
|
services().users.mark_device_key_update(&user_id)?;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
services().globals.bump_database_version(10)?;
|
|
|
|
@ -825,7 +833,8 @@ impl KeyValueDatabase {
|
|
|
|
|
|
|
|
|
|
info!(
|
|
|
|
|
"Loaded {} database with version {}",
|
|
|
|
|
services().globals.config.database_backend, latest_database_version
|
|
|
|
|
services().globals.config.database_backend,
|
|
|
|
|
latest_database_version
|
|
|
|
|
);
|
|
|
|
|
} else {
|
|
|
|
|
services()
|
|
|
|
@ -837,7 +846,8 @@ impl KeyValueDatabase {
|
|
|
|
|
|
|
|
|
|
warn!(
|
|
|
|
|
"Created new {} database with version {}",
|
|
|
|
|
services().globals.config.database_backend, latest_database_version
|
|
|
|
|
services().globals.config.database_backend,
|
|
|
|
|
latest_database_version
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -862,9 +872,7 @@ impl KeyValueDatabase {
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
services()
|
|
|
|
|
.sending
|
|
|
|
|
.start_handler(sending_receiver);
|
|
|
|
|
services().sending.start_handler(sending_receiver);
|
|
|
|
|
|
|
|
|
|
Self::start_cleanup_task().await;
|
|
|
|
|
|
|
|
|
@ -898,7 +906,8 @@ impl KeyValueDatabase {
|
|
|
|
|
|
|
|
|
|
use std::time::{Duration, Instant};
|
|
|
|
|
|
|
|
|
|
let timer_interval = Duration::from_secs(services().globals.config.cleanup_second_interval as u64);
|
|
|
|
|
let timer_interval =
|
|
|
|
|
Duration::from_secs(services().globals.config.cleanup_second_interval as u64);
|
|
|
|
|
|
|
|
|
|
tokio::spawn(async move {
|
|
|
|
|
let mut i = interval(timer_interval);
|
|
|
|
@ -937,8 +946,10 @@ fn set_emergency_access() -> Result<bool> {
|
|
|
|
|
let conduit_user = UserId::parse_with_server_name("conduit", services().globals.server_name())
|
|
|
|
|
.expect("@conduit:server_name is a valid UserId");
|
|
|
|
|
|
|
|
|
|
services().users
|
|
|
|
|
.set_password(&conduit_user, services().globals.emergency_password().as_deref())?;
|
|
|
|
|
services().users.set_password(
|
|
|
|
|
&conduit_user,
|
|
|
|
|
services().globals.emergency_password().as_deref(),
|
|
|
|
|
)?;
|
|
|
|
|
|
|
|
|
|
let (ruleset, res) = match services().globals.emergency_password() {
|
|
|
|
|
Some(_) => (Ruleset::server_default(&conduit_user), Ok(true)),
|
|
|
|
@ -951,7 +962,8 @@ fn set_emergency_access() -> Result<bool> {
|
|
|
|
|
GlobalAccountDataEventType::PushRules.to_string().into(),
|
|
|
|
|
&serde_json::to_value(&GlobalAccountDataEvent {
|
|
|
|
|
content: PushRulesEventContent { global: ruleset },
|
|
|
|
|
}).expect("to json value always works"),
|
|
|
|
|
})
|
|
|
|
|
.expect("to json value always works"),
|
|
|
|
|
)?;
|
|
|
|
|
|
|
|
|
|
res
|
|
|
|
|