diff options
author | Erik Johnston <erik@matrix.org> | 2019-01-21 14:04:19 +0000 |
---|---|---|
committer | Erik Johnston <erik@matrix.org> | 2019-01-21 14:04:19 +0000 |
commit | 35e1d67b4e9c2c8b0abf35d41c2d9c56d486f6e3 (patch) | |
tree | 2c844b79665fc32b0bfc49285586394edf367131 /synapse/handlers/device.py | |
parent | Newsfile (diff) | |
parent | Merge pull request #4390 from matrix-org/erikj/versioned_fed_apis (diff) | |
download | synapse-35e1d67b4e9c2c8b0abf35d41c2d9c56d486f6e3.tar.xz |
Merge branch 'develop' of github.com:matrix-org/synapse into erikj/fed_v2_invite_server
Diffstat (limited to 'synapse/handlers/device.py')
-rw-r--r-- | synapse/handlers/device.py | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/synapse/handlers/device.py b/synapse/handlers/device.py index 9e017116a9..8955cde4ed 100644 --- a/synapse/handlers/device.py +++ b/synapse/handlers/device.py @@ -532,6 +532,25 @@ class DeviceListEduUpdater(object): stream_id = result["stream_id"] devices = result["devices"] + + # If the remote server has more than ~1000 devices for this user + # we assume that something is going horribly wrong (e.g. a bot + # that logs in and creates a new device every time it tries to + # send a message). Maintaining lots of devices per user in the + # cache can cause serious performance issues as if this request + # takes more than 60s to complete, internal replication from the + # inbound federation worker to the synapse master may time out + # causing the inbound federation to fail and causing the remote + # server to retry, causing a DoS. So in this scenario we give + # up on storing the total list of devices and only handle the + # delta instead. + if len(devices) > 1000: + logger.warn( + "Ignoring device list snapshot for %s as it has >1K devs (%d)", + user_id, len(devices) + ) + devices = [] + yield self.store.update_remote_device_list_cache( user_id, devices, stream_id, ) |