mirror of
https://mau.dev/maunium/synapse.git
synced 2024-12-14 20:23:52 +01:00
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:
parent
ac1b0d03a5
commit
299b00d968
2 changed files with 18 additions and 14 deletions
1
changelog.d/13922.bugfix
Normal file
1
changelog.d/13922.bugfix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Fix long-standing bug where device updates could cause delays sending out to-device messages over federation.
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in a new issue