mirror of
https://gitlab.computer.surgery/matrix/grapevine.git
synced 2025-12-17 15:51:23 +01:00
MSC3575: use explicit loop for ops creation
This commit is contained in:
parent
dd705a2bb2
commit
6d4f165629
1 changed files with 50 additions and 55 deletions
|
|
@ -305,64 +305,59 @@ pub(crate) async fn sync_events_v4_route(
|
||||||
|
|
||||||
let mut new_known_rooms = BTreeSet::new();
|
let mut new_known_rooms = BTreeSet::new();
|
||||||
|
|
||||||
|
let mut ops = Vec::new();
|
||||||
|
for (mut from, mut to) in list.ranges {
|
||||||
|
from = from.clamp(
|
||||||
|
uint!(0),
|
||||||
|
UInt::try_from(all_joined_rooms.len() - 1).unwrap_or(UInt::MAX),
|
||||||
|
);
|
||||||
|
to = to.clamp(
|
||||||
|
from,
|
||||||
|
UInt::try_from(all_joined_rooms.len() - 1).unwrap_or(UInt::MAX),
|
||||||
|
);
|
||||||
|
let room_ids =
|
||||||
|
all_joined_rooms[from.try_into().unwrap_or(usize::MAX)
|
||||||
|
..=to.try_into().unwrap_or(usize::MAX)]
|
||||||
|
.to_vec();
|
||||||
|
|
||||||
|
new_known_rooms.extend(room_ids.iter().cloned());
|
||||||
|
for room_id in &room_ids {
|
||||||
|
let todo_room = todo_rooms.entry(room_id.clone()).or_insert((
|
||||||
|
BTreeSet::new(),
|
||||||
|
0,
|
||||||
|
u64::MAX,
|
||||||
|
));
|
||||||
|
let limit = list
|
||||||
|
.room_details
|
||||||
|
.timeline_limit
|
||||||
|
.map_or(10, u64::from)
|
||||||
|
.min(100);
|
||||||
|
todo_room
|
||||||
|
.0
|
||||||
|
.extend(list.room_details.required_state.iter().cloned());
|
||||||
|
todo_room.1 = todo_room.1.max(limit);
|
||||||
|
// 0 means unknown because it got out of date
|
||||||
|
todo_room.2 = todo_room.2.min(
|
||||||
|
known_rooms
|
||||||
|
.get(&list_id)
|
||||||
|
.and_then(|k| k.get(room_id))
|
||||||
|
.copied()
|
||||||
|
.unwrap_or(0),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
ops.push(sync_events::v4::SyncOp {
|
||||||
|
op: SlidingOp::Sync,
|
||||||
|
range: Some((from, to)),
|
||||||
|
index: None,
|
||||||
|
room_ids,
|
||||||
|
room_id: None,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
lists.insert(
|
lists.insert(
|
||||||
list_id.clone(),
|
list_id.clone(),
|
||||||
sync_events::v4::SyncList {
|
sync_events::v4::SyncList {
|
||||||
ops: list
|
ops,
|
||||||
.ranges
|
|
||||||
.into_iter()
|
|
||||||
.map(|mut r| {
|
|
||||||
r.0 = r.0.clamp(
|
|
||||||
uint!(0),
|
|
||||||
UInt::try_from(all_joined_rooms.len() - 1)
|
|
||||||
.unwrap_or(UInt::MAX),
|
|
||||||
);
|
|
||||||
r.1 = r.1.clamp(
|
|
||||||
r.0,
|
|
||||||
UInt::try_from(all_joined_rooms.len() - 1)
|
|
||||||
.unwrap_or(UInt::MAX),
|
|
||||||
);
|
|
||||||
let room_ids = all_joined_rooms[r
|
|
||||||
.0
|
|
||||||
.try_into()
|
|
||||||
.unwrap_or(usize::MAX)
|
|
||||||
..=r.1.try_into().unwrap_or(usize::MAX)]
|
|
||||||
.to_vec();
|
|
||||||
new_known_rooms.extend(room_ids.iter().cloned());
|
|
||||||
for room_id in &room_ids {
|
|
||||||
let todo_room = todo_rooms
|
|
||||||
.entry(room_id.clone())
|
|
||||||
.or_insert((BTreeSet::new(), 0, u64::MAX));
|
|
||||||
let limit = list
|
|
||||||
.room_details
|
|
||||||
.timeline_limit
|
|
||||||
.map_or(10, u64::from)
|
|
||||||
.min(100);
|
|
||||||
todo_room.0.extend(
|
|
||||||
list.room_details
|
|
||||||
.required_state
|
|
||||||
.iter()
|
|
||||||
.cloned(),
|
|
||||||
);
|
|
||||||
todo_room.1 = todo_room.1.max(limit);
|
|
||||||
// 0 means unknown because it got out of date
|
|
||||||
todo_room.2 = todo_room.2.min(
|
|
||||||
known_rooms
|
|
||||||
.get(&list_id)
|
|
||||||
.and_then(|k| k.get(room_id))
|
|
||||||
.copied()
|
|
||||||
.unwrap_or(0),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
sync_events::v4::SyncOp {
|
|
||||||
op: SlidingOp::Sync,
|
|
||||||
range: Some(r),
|
|
||||||
index: None,
|
|
||||||
room_ids,
|
|
||||||
room_id: None,
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.collect(),
|
|
||||||
count: UInt::try_from(all_joined_rooms.len())
|
count: UInt::try_from(all_joined_rooms.len())
|
||||||
.unwrap_or(UInt::MAX),
|
.unwrap_or(UInt::MAX),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue