diff options
author | Brendan Abolivier <babolivier@matrix.org> | 2022-02-16 12:16:48 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-16 11:16:48 +0000 |
commit | 130fd45393d39425a4aa35a388b1e5a74ba6f6f4 (patch) | |
tree | e1aefcd131be47d5bee3bfa635130bce5b78b5f2 /synapse/handlers/room_member.py | |
parent | Optimise calculating device_list changes in `/sync`. (#11974) (diff) | |
download | synapse-130fd45393d39425a4aa35a388b1e5a74ba6f6f4.tar.xz |
Limit concurrent AS joins (#11996)
Initially introduced in matrix-org-hotfixes by e5537cf (and tweaked by later commits). Fixes #11995 See also #4826
Diffstat (limited to '')
-rw-r--r-- | synapse/handlers/room_member.py | 46 |
1 files changed, 27 insertions, 19 deletions
diff --git a/synapse/handlers/room_member.py b/synapse/handlers/room_member.py index bf1a47efb0..b2adc0f48b 100644 --- a/synapse/handlers/room_member.py +++ b/synapse/handlers/room_member.py @@ -82,6 +82,7 @@ class RoomMemberHandler(metaclass=abc.ABCMeta): self.event_auth_handler = hs.get_event_auth_handler() self.member_linearizer: Linearizer = Linearizer(name="member") + self.member_as_limiter = Linearizer(max_count=10, name="member_as_limiter") self.clock = hs.get_clock() self.spam_checker = hs.get_spam_checker() @@ -500,25 +501,32 @@ class RoomMemberHandler(metaclass=abc.ABCMeta): key = (room_id,) - with (await self.member_linearizer.queue(key)): - result = await self.update_membership_locked( - requester, - target, - room_id, - action, - txn_id=txn_id, - remote_room_hosts=remote_room_hosts, - third_party_signed=third_party_signed, - ratelimit=ratelimit, - content=content, - new_room=new_room, - require_consent=require_consent, - outlier=outlier, - historical=historical, - allow_no_prev_events=allow_no_prev_events, - prev_event_ids=prev_event_ids, - auth_event_ids=auth_event_ids, - ) + as_id = object() + if requester.app_service: + as_id = requester.app_service.id + + # We first linearise by the application service (to try to limit concurrent joins + # by application services), and then by room ID. + with (await self.member_as_limiter.queue(as_id)): + with (await self.member_linearizer.queue(key)): + result = await self.update_membership_locked( + requester, + target, + room_id, + action, + txn_id=txn_id, + remote_room_hosts=remote_room_hosts, + third_party_signed=third_party_signed, + ratelimit=ratelimit, + content=content, + new_room=new_room, + require_consent=require_consent, + outlier=outlier, + historical=historical, + allow_no_prev_events=allow_no_prev_events, + prev_event_ids=prev_event_ids, + auth_event_ids=auth_event_ids, + ) return result |