summary refs log tree commit diff
path: root/synapse
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2023-03-29 14:37:06 +0100
committerGitHub <noreply@github.com>2023-03-29 13:37:06 +0000
commitf0d8f66eaaacfa75bed65bc5d0c602fbc5339c85 (patch)
treeec056eecace1f460480e0e7334287dc876d82cf4 /synapse
parentRevert "Reintroduce membership tables event stream ordering (#15128)" (#15347) (diff)
downloadsynapse-f0d8f66eaaacfa75bed65bc5d0c602fbc5339c85.tar.xz
Fix registering a device on an account with lots of devices (#15348)
Fixes up #15183
Diffstat (limited to 'synapse')
-rw-r--r--synapse/handlers/register.py2
-rw-r--r--synapse/storage/databases/main/devices.py9
2 files changed, 8 insertions, 3 deletions
diff --git a/synapse/handlers/register.py b/synapse/handlers/register.py
index bb1df1e60f..7e9d065f50 100644
--- a/synapse/handlers/register.py
+++ b/synapse/handlers/register.py
@@ -946,6 +946,8 @@ class RegistrationHandler:
         if not device_ids:
             return
 
+        logger.info("Pruning %d stale devices for %s", len(device_ids), user_id)
+
         # Now spawn a background loop that deletes said devices.
         async def _prune_too_many_devices_loop() -> None:
             if user_id in self._currently_pruning_devices_for_users:
diff --git a/synapse/storage/databases/main/devices.py b/synapse/storage/databases/main/devices.py
index 7647cda2c6..f61b7bc96e 100644
--- a/synapse/storage/databases/main/devices.py
+++ b/synapse/storage/databases/main/devices.py
@@ -1638,19 +1638,22 @@ class DeviceBackgroundUpdateStore(SQLBaseStore):
             """
 
             rows = await self.db_pool.execute(
-                "check_too_many_devices_for_user_last_seen", None, sql, (user_id,)
+                "check_too_many_devices_for_user_last_seen",
+                None,
+                sql,
+                user_id,
             )
             if rows:
                 max_last_seen = max(rows[0][0], max_last_seen)
 
         # Fetch the devices to delete.
         sql = """
-            SELECT DISTINCT device_id FROM devices
+            SELECT device_id FROM devices
             LEFT JOIN e2e_device_keys_json USING (user_id, device_id)
             WHERE
                 user_id = ?
                 AND NOT hidden
-                AND last_seen < ?
+                AND last_seen <= ?
                 AND key_json IS NULL
             ORDER BY last_seen
         """