@@ -126,6 +126,7 @@ def resolve_events_with_store(
126
126
127
127
# Now sequentially auth each one
128
128
resolved_state = yield _iterative_auth_checks (
129
+ clock ,
129
130
room_id ,
130
131
room_version ,
131
132
sorted_power_events ,
@@ -154,6 +155,7 @@ def resolve_events_with_store(
154
155
logger .debug ("resolving remaining events" )
155
156
156
157
resolved_state = yield _iterative_auth_checks (
158
+ clock ,
157
159
room_id ,
158
160
room_version ,
159
161
leftover_events ,
@@ -378,12 +380,13 @@ def _get_power_order(event_id):
378
380
379
381
@defer .inlineCallbacks
380
382
def _iterative_auth_checks (
381
- room_id , room_version , event_ids , base_state , event_map , state_res_store
383
+ clock , room_id , room_version , event_ids , base_state , event_map , state_res_store
382
384
):
383
385
"""Sequentially apply auth checks to each event in given list, updating the
384
386
state as it goes along.
385
387
386
388
Args:
389
+ clock (Clock)
387
390
room_id (str)
388
391
room_version (str)
389
392
event_ids (list[str]): Ordered list of events to apply auth checks to
@@ -397,7 +400,7 @@ def _iterative_auth_checks(
397
400
resolved_state = base_state .copy ()
398
401
room_version_obj = KNOWN_ROOM_VERSIONS [room_version ]
399
402
400
- for event_id in event_ids :
403
+ for idx , event_id in enumerate ( event_ids , start = 1 ) :
401
404
event = event_map [event_id ]
402
405
403
406
auth_events = {}
@@ -435,6 +438,11 @@ def _iterative_auth_checks(
435
438
except AuthError :
436
439
pass
437
440
441
+ # We yield occasionally when we're working with large data sets to
442
+ # ensure that we don't block the reactor loop for too long.
443
+ if idx % _YIELD_AFTER_ITERATIONS == 0 :
444
+ yield clock .sleep (0 )
445
+
438
446
return resolved_state
439
447
440
448
0 commit comments