From 654902a7583d20d7e0b57dc4634fbe573ff99993 Mon Sep 17 00:00:00 2001
From: Erik Johnston <erik@matrix.org>
Date: Mon, 24 Jul 2023 13:43:43 +0100
Subject: [PATCH] Resync stale devices in background (#15975)

This is so we don't block responding to federation transaction while we
try and fetch the device lists.
---
 changelog.d/15975.bugfix   | 1 +
 synapse/handlers/device.py | 9 ++++++++-
 2 files changed, 9 insertions(+), 1 deletion(-)
 create mode 100644 changelog.d/15975.bugfix

diff --git a/changelog.d/15975.bugfix b/changelog.d/15975.bugfix
new file mode 100644
index 0000000000..59738cca0a
--- /dev/null
+++ b/changelog.d/15975.bugfix
@@ -0,0 +1 @@
+Fix bug where resyncing stale device lists could block responding to federation transactions, and thus delay receiving new data from the remote server.
diff --git a/synapse/handlers/device.py b/synapse/handlers/device.py
index 5d12a39e26..d73d9dca08 100644
--- a/synapse/handlers/device.py
+++ b/synapse/handlers/device.py
@@ -1124,7 +1124,14 @@ class DeviceListUpdater(DeviceListWorkerUpdater):
                 )
 
             if resync:
-                await self.multi_user_device_resync([user_id])
+                # We mark as stale up front in case we get restarted.
+                await self.store.mark_remote_users_device_caches_as_stale([user_id])
+                run_as_background_process(
+                    "_maybe_retry_device_resync",
+                    self.multi_user_device_resync,
+                    [user_id],
+                    False,
+                )
             else:
                 # Simply update the single device, since we know that is the only
                 # change (because of the single prev_id matching the current cache)
-- 
GitLab