summaryrefslogtreecommitdiff
path: root/src/database
diff options
context:
space:
mode:
authorTimo Kösters <timo@koesters.xyz>2023-06-27 13:06:55 +0200
committerTimo Kösters <timo@koesters.xyz>2023-06-27 13:15:11 +0200
commitbe877ef7191a2d6cbe9a3c9b40125f1bc42e6961 (patch)
tree585372dc5779527a3605dcee9dacdd6c7a3323a3 /src/database
parent7c6d25dcd165ffa3535ba103ab5ffb4acbe8c558 (diff)
downloadconduit-be877ef7191a2d6cbe9a3c9b40125f1bc42e6961.zip
Improve sync performance with more caching and wrapping things in Arcs to avoid copies
Diffstat (limited to 'src/database')
-rw-r--r--src/database/key_value/rooms/state_accessor.rs6
-rw-r--r--src/database/key_value/rooms/state_compressor.rs10
-rw-r--r--src/database/mod.rs4
3 files changed, 10 insertions, 10 deletions
diff --git a/src/database/key_value/rooms/state_accessor.rs b/src/database/key_value/rooms/state_accessor.rs
index 0f0c0dc..ad08f46 100644
--- a/src/database/key_value/rooms/state_accessor.rs
+++ b/src/database/key_value/rooms/state_accessor.rs
@@ -16,7 +16,7 @@ impl service::rooms::state_accessor::Data for KeyValueDatabase {
.1;
let mut result = HashMap::new();
let mut i = 0;
- for compressed in full_state.into_iter() {
+ for compressed in full_state.iter() {
let parsed = services()
.rooms
.state_compressor
@@ -45,7 +45,7 @@ impl service::rooms::state_accessor::Data for KeyValueDatabase {
let mut result = HashMap::new();
let mut i = 0;
- for compressed in full_state {
+ for compressed in full_state.iter() {
let (_, eventid) = services()
.rooms
.state_compressor
@@ -95,7 +95,7 @@ impl service::rooms::state_accessor::Data for KeyValueDatabase {
.expect("there is always one layer")
.1;
Ok(full_state
- .into_iter()
+ .iter()
.find(|bytes| bytes.starts_with(&shortstatekey.to_be_bytes()))
.and_then(|compressed| {
services()
diff --git a/src/database/key_value/rooms/state_compressor.rs b/src/database/key_value/rooms/state_compressor.rs
index d0a9be4..65ea603 100644
--- a/src/database/key_value/rooms/state_compressor.rs
+++ b/src/database/key_value/rooms/state_compressor.rs
@@ -1,4 +1,4 @@
-use std::{collections::HashSet, mem::size_of};
+use std::{collections::HashSet, mem::size_of, sync::Arc};
use crate::{
database::KeyValueDatabase,
@@ -37,20 +37,20 @@ impl service::rooms::state_compressor::Data for KeyValueDatabase {
Ok(StateDiff {
parent,
- added,
- removed,
+ added: Arc::new(added),
+ removed: Arc::new(removed),
})
}
fn save_statediff(&self, shortstatehash: u64, diff: StateDiff) -> Result<()> {
let mut value = diff.parent.unwrap_or(0).to_be_bytes().to_vec();
- for new in &diff.added {
+ for new in diff.added.iter() {
value.extend_from_slice(&new[..]);
}
if !diff.removed.is_empty() {
value.extend_from_slice(&0_u64.to_be_bytes());
- for removed in &diff.removed {
+ for removed in diff.removed.iter() {
value.extend_from_slice(&removed[..]);
}
}
diff --git a/src/database/mod.rs b/src/database/mod.rs
index 5d89d4a..4e7bda6 100644
--- a/src/database/mod.rs
+++ b/src/database/mod.rs
@@ -587,8 +587,8 @@ impl KeyValueDatabase {
services().rooms.state_compressor.save_state_from_diff(
current_sstatehash,
- statediffnew,
- statediffremoved,
+ Arc::new(statediffnew),
+ Arc::new(statediffremoved),
2, // every state change is 2 event changes on average
states_parents,
)?;