Prioritize outbound to-device over device list updates (#13922)

Otherwise device list changes for large accounts can temporarily delay to-device messages.
This commit is contained in:
Erik Johnston 2022-09-27 15:17:41 +01:00 committed by GitHub
parent ac1b0d03a5
commit 299b00d968
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 14 deletions

1
changelog.d/13922.bugfix Normal file
View File

@ -0,0 +1 @@
Fix long-standing bug where device updates could cause delays sending out to-device messages over federation.

View File

@ -646,10 +646,25 @@ class _TransactionQueueManager:
# We start by fetching device related EDUs, i.e device updates and to # We start by fetching device related EDUs, i.e device updates and to
# device messages. We have to keep 2 free slots for presence and rr_edus. # device messages. We have to keep 2 free slots for presence and rr_edus.
limit = MAX_EDUS_PER_TRANSACTION - 2 device_edu_limit = MAX_EDUS_PER_TRANSACTION - 2
# We prioritize to-device messages so that existing encryption channels
# work. We also keep a few slots spare (by reducing the limit) so that
# we can still trickle out some device list updates.
(
to_device_edus,
device_stream_id,
) = await self.queue._get_to_device_message_edus(device_edu_limit - 10)
if to_device_edus:
self._device_stream_id = device_stream_id
else:
self.queue._last_device_stream_id = device_stream_id
device_edu_limit -= len(to_device_edus)
device_update_edus, dev_list_id = await self.queue._get_device_update_edus( device_update_edus, dev_list_id = await self.queue._get_device_update_edus(
limit device_edu_limit
) )
if device_update_edus: if device_update_edus:
@ -657,18 +672,6 @@ class _TransactionQueueManager:
else: else:
self.queue._last_device_list_stream_id = dev_list_id self.queue._last_device_list_stream_id = dev_list_id
limit -= len(device_update_edus)
(
to_device_edus,
device_stream_id,
) = await self.queue._get_to_device_message_edus(limit)
if to_device_edus:
self._device_stream_id = device_stream_id
else:
self.queue._last_device_stream_id = device_stream_id
pending_edus = device_update_edus + to_device_edus pending_edus = device_update_edus + to_device_edus
# Now add the read receipt EDU. # Now add the read receipt EDU.