Merge pull request 'improvement: only remove to-device events when sure the client received them' (#139) from improve-to-device-removal into master
Reviewed-on: https://git.koesters.xyz/timo/conduit/pulls/139
This commit is contained in:
commit
f8544bf6e3
2 changed files with 43 additions and 8 deletions
|
@ -2659,6 +2659,9 @@ pub fn sync_route(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remove all to-device events the device received *last time*
|
||||||
|
db.users.remove_to_device_events(user_id, device_id, since)?;
|
||||||
|
|
||||||
Ok(sync_events::Response {
|
Ok(sync_events::Response {
|
||||||
next_batch,
|
next_batch,
|
||||||
rooms: sync_events::Rooms {
|
rooms: sync_events::Rooms {
|
||||||
|
@ -2711,7 +2714,7 @@ pub fn sync_route(
|
||||||
},
|
},
|
||||||
device_one_time_keys_count: Default::default(), // TODO
|
device_one_time_keys_count: Default::default(), // TODO
|
||||||
to_device: sync_events::ToDevice {
|
to_device: sync_events::ToDevice {
|
||||||
events: db.users.take_to_device_events(user_id, device_id, 100)?,
|
events: db.users.get_to_device_events(user_id, device_id)?,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
.into())
|
.into())
|
||||||
|
|
|
@ -11,7 +11,7 @@ use ruma::{
|
||||||
events::{AnyToDeviceEvent, EventJson, EventType},
|
events::{AnyToDeviceEvent, EventJson, EventType},
|
||||||
identifiers::{DeviceId, UserId},
|
identifiers::{DeviceId, UserId},
|
||||||
};
|
};
|
||||||
use std::{collections::BTreeMap, convert::TryFrom, time::SystemTime};
|
use std::{collections::BTreeMap, convert::TryFrom, mem, time::SystemTime};
|
||||||
|
|
||||||
pub struct Users {
|
pub struct Users {
|
||||||
pub(super) userid_password: sled::Tree,
|
pub(super) userid_password: sled::Tree,
|
||||||
|
@ -660,11 +660,10 @@ impl Users {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn take_to_device_events(
|
pub fn get_to_device_events(
|
||||||
&self,
|
&self,
|
||||||
user_id: &UserId,
|
user_id: &UserId,
|
||||||
device_id: &DeviceId,
|
device_id: &DeviceId,
|
||||||
max: usize,
|
|
||||||
) -> Result<Vec<EventJson<AnyToDeviceEvent>>> {
|
) -> Result<Vec<EventJson<AnyToDeviceEvent>>> {
|
||||||
let mut events = Vec::new();
|
let mut events = Vec::new();
|
||||||
|
|
||||||
|
@ -673,18 +672,51 @@ impl Users {
|
||||||
prefix.extend_from_slice(device_id.as_str().as_bytes());
|
prefix.extend_from_slice(device_id.as_str().as_bytes());
|
||||||
prefix.push(0xff);
|
prefix.push(0xff);
|
||||||
|
|
||||||
for result in self.todeviceid_events.scan_prefix(&prefix).take(max) {
|
for value in self.todeviceid_events.scan_prefix(&prefix).values() {
|
||||||
let (key, value) = result?;
|
|
||||||
events.push(
|
events.push(
|
||||||
serde_json::from_slice(&*value)
|
serde_json::from_slice(&*value?)
|
||||||
.map_err(|_| Error::bad_database("Event in todeviceid_events is invalid."))?,
|
.map_err(|_| Error::bad_database("Event in todeviceid_events is invalid."))?,
|
||||||
);
|
);
|
||||||
self.todeviceid_events.remove(key)?;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(events)
|
Ok(events)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn remove_to_device_events(
|
||||||
|
&self,
|
||||||
|
user_id: &UserId,
|
||||||
|
device_id: &DeviceId,
|
||||||
|
until: u64,
|
||||||
|
) -> Result<()> {
|
||||||
|
let mut prefix = user_id.to_string().as_bytes().to_vec();
|
||||||
|
prefix.push(0xff);
|
||||||
|
prefix.extend_from_slice(device_id.as_ref().as_bytes());
|
||||||
|
prefix.push(0xff);
|
||||||
|
|
||||||
|
let mut last = prefix.clone();
|
||||||
|
last.extend_from_slice(&until.to_be_bytes());
|
||||||
|
|
||||||
|
for (key, _) in self
|
||||||
|
.todeviceid_events
|
||||||
|
.range(&*prefix..=&*last)
|
||||||
|
.keys()
|
||||||
|
.map(|key| {
|
||||||
|
let key = key?;
|
||||||
|
Ok::<_, Error>((
|
||||||
|
key.clone(),
|
||||||
|
utils::u64_from_bytes(&key[key.len() - mem::size_of::<u64>()..key.len()])
|
||||||
|
.map_err(|_| Error::bad_database("ToDeviceId has invalid count bytes."))?,
|
||||||
|
))
|
||||||
|
})
|
||||||
|
.filter_map(|r| r.ok())
|
||||||
|
.take_while(|&(_, count)| count <= until)
|
||||||
|
{
|
||||||
|
self.todeviceid_events.remove(key)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
pub fn update_device_metadata(
|
pub fn update_device_metadata(
|
||||||
&self,
|
&self,
|
||||||
user_id: &UserId,
|
user_id: &UserId,
|
||||||
|
|
Loading…
Reference in a new issue