Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit b660327

Browse files
authored
Resync remote device list when detected as stale. (#6786)
1 parent c3d4ad8 commit b660327

File tree

4 files changed

+28
-7
lines changed

4 files changed

+28
-7
lines changed

changelog.d/6786.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Attempt to resync remote users' devices when detected as stale.

synapse/handlers/devicemessage.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from twisted.internet import defer
2222

2323
from synapse.api.errors import SynapseError
24+
from synapse.logging.context import run_in_background
2425
from synapse.logging.opentracing import (
2526
get_active_span_text_map,
2627
log_kv,
@@ -48,6 +49,8 @@ def __init__(self, hs):
4849
"m.direct_to_device", self.on_direct_to_device_edu
4950
)
5051

52+
self._device_list_updater = hs.get_device_handler().device_list_updater
53+
5154
@defer.inlineCallbacks
5255
def on_direct_to_device_edu(self, origin, content):
5356
local_messages = {}
@@ -134,8 +137,11 @@ def _check_for_unknown_devices(
134137
unknown_devices,
135138
)
136139
yield self.store.mark_remote_user_device_cache_as_stale(sender_user_id)
137-
# TODO: Poke something to start trying to refetch user's
138-
# keys.
140+
141+
# Immediately attempt a resync in the background
142+
run_in_background(
143+
self._device_list_updater.user_device_resync, sender_user_id
144+
)
139145

140146
@defer.inlineCallbacks
141147
def send_device_message(self, sender_user_id, message_type, messages):

synapse/handlers/federation.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
run_in_background,
5858
)
5959
from synapse.logging.utils import log_function
60+
from synapse.replication.http.devices import ReplicationUserDevicesResyncRestServlet
6061
from synapse.replication.http.federation import (
6162
ReplicationCleanRoomRestServlet,
6263
ReplicationFederationSendEventsRestServlet,
@@ -156,6 +157,13 @@ def __init__(self, hs):
156157
hs
157158
)
158159

160+
if hs.config.worker_app:
161+
self._user_device_resync = ReplicationUserDevicesResyncRestServlet.make_client(
162+
hs
163+
)
164+
else:
165+
self._device_list_updater = hs.get_device_handler().device_list_updater
166+
159167
# When joining a room we need to queue any events for that room up
160168
self.room_queues = {}
161169
self._room_pdu_linearizer = Linearizer("fed_room_pdu")
@@ -759,8 +767,14 @@ async def _process_received_pdu(
759767
await self.store.mark_remote_user_device_cache_as_stale(
760768
event.sender
761769
)
762-
# TODO: Poke something to start trying to refetch user's
763-
# keys.
770+
771+
# Immediately attempt a resync in the background
772+
if self.config.worker_app:
773+
return run_in_background(self._user_device_resync, event.sender)
774+
else:
775+
return run_in_background(
776+
self._device_list_updater.user_device_resync, event.sender
777+
)
764778

765779
@log_function
766780
async def backfill(self, dest, room_id, limit, extremities):

tests/handlers/test_typing.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ def make_homeserver(self, reactor, clock):
8181
]
8282
)
8383

84+
# the tests assume that we are starting at unix time 1000
85+
reactor.pump((1000,))
86+
8487
hs = self.setup_test_homeserver(
8588
notifier=Mock(), http_client=mock_federation_client, keyring=mock_keyring
8689
)
@@ -90,9 +93,6 @@ def make_homeserver(self, reactor, clock):
9093
return hs
9194

9295
def prepare(self, reactor, clock, hs):
93-
# the tests assume that we are starting at unix time 1000
94-
reactor.pump((1000,))
95-
9696
mock_notifier = hs.get_notifier()
9797
self.on_new_event = mock_notifier.on_new_event
9898

0 commit comments

Comments
 (0)