slight optimizations for statediff
calculate with_capacity for set/get_statediff() etc Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
parent
20836cc3db
commit
5f625216aa
1 changed files with 34 additions and 16 deletions
|
@ -5,6 +5,7 @@ use std::{
|
||||||
sync::{Arc, Mutex},
|
sync::{Arc, Mutex},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use arrayvec::ArrayVec;
|
||||||
use conduit::{
|
use conduit::{
|
||||||
at, checked, err, expected, utils,
|
at, checked, err, expected, utils,
|
||||||
utils::{bytes, math::usize_from_f64},
|
utils::{bytes, math::usize_from_f64},
|
||||||
|
@ -37,7 +38,7 @@ struct Data {
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
struct StateDiff {
|
struct StateDiff {
|
||||||
parent: Option<u64>,
|
parent: Option<ShortStateHash>,
|
||||||
added: Arc<CompressedState>,
|
added: Arc<CompressedState>,
|
||||||
removed: Arc<CompressedState>,
|
removed: Arc<CompressedState>,
|
||||||
}
|
}
|
||||||
|
@ -165,17 +166,20 @@ impl Service {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn compress_state_event(&self, shortstatekey: ShortStateKey, event_id: &EventId) -> CompressedStateEvent {
|
pub async fn compress_state_event(&self, shortstatekey: ShortStateKey, event_id: &EventId) -> CompressedStateEvent {
|
||||||
let mut v = shortstatekey.to_be_bytes().to_vec();
|
const SIZE: usize = size_of::<CompressedStateEvent>();
|
||||||
v.extend_from_slice(
|
|
||||||
&self
|
let shorteventid = self
|
||||||
.services
|
.services
|
||||||
.short
|
.short
|
||||||
.get_or_create_shorteventid(event_id)
|
.get_or_create_shorteventid(event_id)
|
||||||
.await
|
.await;
|
||||||
.to_be_bytes(),
|
|
||||||
);
|
|
||||||
|
|
||||||
v.try_into().expect("we checked the size above")
|
let mut v = ArrayVec::<u8, SIZE>::new();
|
||||||
|
v.extend(shortstatekey.to_be_bytes());
|
||||||
|
v.extend(shorteventid.to_be_bytes());
|
||||||
|
v.as_ref()
|
||||||
|
.try_into()
|
||||||
|
.expect("failed to create CompressedStateEvent")
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns shortstatekey, event id
|
/// Returns shortstatekey, event id
|
||||||
|
@ -185,11 +189,12 @@ impl Service {
|
||||||
) -> Result<(ShortStateKey, Arc<EventId>)> {
|
) -> Result<(ShortStateKey, Arc<EventId>)> {
|
||||||
use utils::u64_from_u8;
|
use utils::u64_from_u8;
|
||||||
|
|
||||||
let shortstatekey = u64_from_u8(&compressed_event[0..size_of::<u64>()]);
|
let shortstatekey = u64_from_u8(&compressed_event[0..size_of::<ShortStateKey>()]);
|
||||||
|
let shorteventid = u64_from_u8(&compressed_event[size_of::<ShortStateKey>()..]);
|
||||||
let event_id = self
|
let event_id = self
|
||||||
.services
|
.services
|
||||||
.short
|
.short
|
||||||
.get_eventid_from_short(u64_from_u8(&compressed_event[size_of::<u64>()..]))
|
.get_eventid_from_short(shorteventid)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
Ok((shortstatekey, event_id))
|
Ok((shortstatekey, event_id))
|
||||||
|
@ -415,9 +420,12 @@ impl Service {
|
||||||
.ok()
|
.ok()
|
||||||
.take_if(|parent| *parent != 0);
|
.take_if(|parent| *parent != 0);
|
||||||
|
|
||||||
|
debug_assert!(value.len() % STRIDE == 0, "value not aligned to stride");
|
||||||
|
let num_values = value.len() / STRIDE;
|
||||||
|
|
||||||
let mut add_mode = true;
|
let mut add_mode = true;
|
||||||
let mut added = HashSet::new();
|
let mut added = HashSet::with_capacity(num_values);
|
||||||
let mut removed = HashSet::new();
|
let mut removed = HashSet::with_capacity(num_values);
|
||||||
|
|
||||||
let mut i = STRIDE;
|
let mut i = STRIDE;
|
||||||
while let Some(v) = value.get(i..expected!(i + 2 * STRIDE)) {
|
while let Some(v) = value.get(i..expected!(i + 2 * STRIDE)) {
|
||||||
|
@ -434,6 +442,8 @@ impl Service {
|
||||||
i = expected!(i + 2 * STRIDE);
|
i = expected!(i + 2 * STRIDE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
added.shrink_to_fit();
|
||||||
|
removed.shrink_to_fit();
|
||||||
Ok(StateDiff {
|
Ok(StateDiff {
|
||||||
parent,
|
parent,
|
||||||
added: Arc::new(added),
|
added: Arc::new(added),
|
||||||
|
@ -442,7 +452,15 @@ impl Service {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn save_statediff(&self, shortstatehash: ShortStateHash, diff: &StateDiff) {
|
fn save_statediff(&self, shortstatehash: ShortStateHash, diff: &StateDiff) {
|
||||||
let mut value = diff.parent.unwrap_or(0).to_be_bytes().to_vec();
|
let mut value = Vec::<u8>::with_capacity(
|
||||||
|
2_usize
|
||||||
|
.saturating_add(diff.added.len())
|
||||||
|
.saturating_add(diff.removed.len()),
|
||||||
|
);
|
||||||
|
|
||||||
|
let parent = diff.parent.unwrap_or(0_u64);
|
||||||
|
value.extend_from_slice(&parent.to_be_bytes());
|
||||||
|
|
||||||
for new in diff.added.iter() {
|
for new in diff.added.iter() {
|
||||||
value.extend_from_slice(&new[..]);
|
value.extend_from_slice(&new[..]);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue