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

Commit

Permalink
don't store more remote device lists if they have more than 1K devices (
Browse files Browse the repository at this point in the history
  • Loading branch information
richvdh authored Jan 16, 2019
1 parent 7f1a6a4 commit 05e1296
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 0 deletions.
1 change: 1 addition & 0 deletions changelog.d/4397.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix high CPU usage due to remote devicelist updates
19 changes: 19 additions & 0 deletions synapse/handlers/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -532,6 +532,25 @@ def _handle_device_updates(self, user_id):

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,
)
Expand Down

0 comments on commit 05e1296

Please sign in to comment.