Ensure a long state res does not starve CPU (#15960)

We do this by yielding the reactor in hot loops.
pull/15968/head
Erik Johnston 2023-07-19 18:00:33 +01:00 committed by GitHub
parent 19796e20aa
commit 67f9e5293e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 9 additions and 1 deletions

1
changelog.d/15960.misc Normal file
View File

@ -0,0 +1 @@
Ensure a long state res does not starve CPU by occasionally yielding to the reactor.

View File

@ -667,7 +667,7 @@ async def _mainline_sort(
order_map = {}
for idx, ev_id in enumerate(event_ids, start=1):
depth = await _get_mainline_depth_for_event(
event_map[ev_id], mainline_map, event_map, state_res_store
clock, event_map[ev_id], mainline_map, event_map, state_res_store
)
order_map[ev_id] = (depth, event_map[ev_id].origin_server_ts, ev_id)
@ -682,6 +682,7 @@ async def _mainline_sort(
async def _get_mainline_depth_for_event(
clock: Clock,
event: EventBase,
mainline_map: Dict[str, int],
event_map: Dict[str, EventBase],
@ -704,6 +705,7 @@ async def _get_mainline_depth_for_event(
# We do an iterative search, replacing `event with the power level in its
# auth events (if any)
idx = 0
while tmp_event:
depth = mainline_map.get(tmp_event.event_id)
if depth is not None:
@ -720,6 +722,11 @@ async def _get_mainline_depth_for_event(
tmp_event = aev
break
idx += 1
if idx % _AWAIT_AFTER_ITERATIONS == 0:
await clock.sleep(0)
# Didn't find a power level auth event, so we just return 0
return 0