Skip to content

Commit c2f4222

Browse files
richvdhpoljar
authored andcommitted
Review comment: process failed devices together
1 parent d90c623 commit c2f4222

File tree

1 file changed

+21
-14
lines changed
  • crates/matrix-sdk-crypto/src/session_manager

1 file changed

+21
-14
lines changed

crates/matrix-sdk-crypto/src/session_manager/sessions.rs

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -350,37 +350,44 @@ impl SessionManager {
350350
self.failures.extend(failed_servers);
351351
self.failures.remove(successful_servers);
352352

353-
// build a map of user_id -> device_id -> key for each device to we can start
354-
// a session with.
353+
// build a map of user_id -> device_id -> key for each device we can start a
354+
// session with...
355355
let mut device_map: BTreeMap<
356356
OwnedUserId,
357357
BTreeMap<OwnedDeviceId, &Raw<ruma::encryption::OneTimeKey>>,
358358
> = BTreeMap::new();
359359

360+
// ... and a list of (user_id, device_id) pairs where the one-time-key is
361+
// missing
362+
let mut missing_devices: Vec<(OwnedUserId, OwnedDeviceId)> = Vec::new();
363+
360364
for (user_id, user_devices) in response.one_time_keys.iter() {
361365
for (device_id, key_map) in user_devices {
362366
match key_map.values().next() {
363367
Some(k) => {
364368
device_map.entry(user_id.clone()).or_default().insert(device_id.clone(), k);
365369
}
366370
None => {
367-
warn!(
368-
user_id = user_id.as_str(),
369-
device_id = device_id.as_str(),
370-
"Tried to create a new Olm session, but the signed one-time key is missing",
371-
);
372-
373-
self.failed_devices
374-
.write()
375-
.unwrap()
376-
.entry(user_id.clone())
377-
.or_default()
378-
.insert(device_id.clone());
371+
missing_devices.push((user_id.clone(), device_id.clone()));
379372
}
380373
};
381374
}
382375
}
383376

377+
// process all the missing devices at once to save repeatedly grabbing the lock
378+
if !missing_devices.is_empty() {
379+
warn!(
380+
?missing_devices,
381+
"Tried to create a new sessions, but the signed one-time key was missing for some devices",
382+
);
383+
384+
let mut failed_devices_lock = self.failed_devices.write().unwrap();
385+
386+
for (user_id, device_id) in missing_devices {
387+
failed_devices_lock.entry(user_id).or_default().insert(device_id);
388+
}
389+
}
390+
384391
self.create_sessions(&device_map).await
385392
}
386393

0 commit comments

Comments
 (0)