@@ -350,37 +350,44 @@ impl SessionManager {
350
350
self . failures . extend ( failed_servers) ;
351
351
self . failures . remove ( successful_servers) ;
352
352
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.. .
355
355
let mut device_map: BTreeMap <
356
356
OwnedUserId ,
357
357
BTreeMap < OwnedDeviceId , & Raw < ruma:: encryption:: OneTimeKey > > ,
358
358
> = BTreeMap :: new ( ) ;
359
359
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
+
360
364
for ( user_id, user_devices) in response. one_time_keys . iter ( ) {
361
365
for ( device_id, key_map) in user_devices {
362
366
match key_map. values ( ) . next ( ) {
363
367
Some ( k) => {
364
368
device_map. entry ( user_id. clone ( ) ) . or_default ( ) . insert ( device_id. clone ( ) , k) ;
365
369
}
366
370
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 ( ) ) ) ;
379
372
}
380
373
} ;
381
374
}
382
375
}
383
376
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
+
384
391
self . create_sessions ( & device_map) . await
385
392
}
386
393
0 commit comments