mirror of
https://git.anonymousland.org/anonymousland/synapse-product.git
synced 2024-12-12 00:14:18 -05:00
don't store more remote device lists if they have more than 1K devices (#4397)
This commit is contained in:
parent
7f1a6a4ea5
commit
05e1296649
1
changelog.d/4397.bugfix
Normal file
1
changelog.d/4397.bugfix
Normal file
@ -0,0 +1 @@
|
|||||||
|
Fix high CPU usage due to remote devicelist updates
|
@ -532,6 +532,25 @@ class DeviceListEduUpdater(object):
|
|||||||
|
|
||||||
stream_id = result["stream_id"]
|
stream_id = result["stream_id"]
|
||||||
devices = result["devices"]
|
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(
|
yield self.store.update_remote_device_list_cache(
|
||||||
user_id, devices, stream_id,
|
user_id, devices, stream_id,
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user