Fixes for sliding-sync request replays.

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk
2025-10-21 05:25:27 +00:00
parent aa4486dfdf
commit d2aab468cf
4 changed files with 87 additions and 61 deletions

View File

@@ -49,7 +49,7 @@ pub(super) async fn handle(
) -> Result<Option<response::Room>> {
debug_assert!(DEFAULT_BUMP_TYPES.is_sorted(), "DEFAULT_BUMP_TYPES is not sorted");
let &Room { roomsince } = conn
let &Room { roomsince, .. } = conn
.rooms
.get(room_id)
.ok_or_else(|| err!("Missing connection state for {room_id}"))?;

View File

@@ -95,26 +95,16 @@ where
.map(move |range| (id.clone(), range))
})
.flat_map(|(id, (start, end))| {
let list = rooms
rooms
.clone()
.filter(move |&room| room.lists.contains(&id));
let cycled = list.clone().all(|room| {
conn.rooms
.get(&room.room_id)
.is_some_and(|room| room.roomsince != 0)
});
list.enumerate()
.filter(move |&room| room.lists.contains(&id))
.enumerate()
.skip_while(move |&(i, room)| {
i < start
|| conn
.rooms
.get(&room.room_id)
.is_some_and(|conn_room| {
conn_room.roomsince >= room.last_count
|| (!cycled && conn_room.roomsince != 0)
})
.is_some_and(|conn_room| conn_room.roomsince >= room.last_count)
})
.take(end.saturating_add(1).saturating_sub(start))
.map(|(_, room)| (room.room_id.clone(), room.clone()))
@@ -193,7 +183,7 @@ async fn match_lists_for_room(
.then(|| {
services
.account_data
.last_count(Some(room_id.as_ref()), sender_user, conn.next_batch)
.last_count(Some(room_id.as_ref()), sender_user, None)
.ok()
})
.into();
@@ -204,7 +194,7 @@ async fn match_lists_for_room(
.then(|| {
services
.read_receipt
.last_receipt_count(&room_id, sender_user.into(), conn.globalsince.into())
.last_receipt_count(&room_id, sender_user.into(), None)
.map(Result::ok)
})
.into();