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

Commit e3163e2

Browse files
authored
Reduce the amount of state we pull from the DB (#12811)
1 parent 6b46c3e commit e3163e2

File tree

23 files changed

+161
-146
lines changed

23 files changed

+161
-146
lines changed

changelog.d/12811.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Reduce the amount of state we pull from the DB.

synapse/api/auth.py

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,11 @@
2929
MissingClientTokenError,
3030
)
3131
from synapse.appservice import ApplicationService
32-
from synapse.events import EventBase
3332
from synapse.http import get_request_user_agent
3433
from synapse.http.site import SynapseRequest
3534
from synapse.logging.opentracing import active_span, force_tracing, start_active_span
3635
from synapse.storage.databases.main.registration import TokenLookupResult
37-
from synapse.types import Requester, StateMap, UserID, create_requester
36+
from synapse.types import Requester, UserID, create_requester
3837
from synapse.util.caches.lrucache import LruCache
3938
from synapse.util.macaroons import get_value_from_macaroon, satisfy_expiry
4039

@@ -61,8 +60,8 @@ def __init__(self, hs: "HomeServer"):
6160
self.hs = hs
6261
self.clock = hs.get_clock()
6362
self.store = hs.get_datastores().main
64-
self.state = hs.get_state_handler()
6563
self._account_validity_handler = hs.get_account_validity_handler()
64+
self._storage_controllers = hs.get_storage_controllers()
6665

6766
self.token_cache: LruCache[str, Tuple[str, bool]] = LruCache(
6867
10000, "token_cache"
@@ -79,9 +78,8 @@ async def check_user_in_room(
7978
self,
8079
room_id: str,
8180
user_id: str,
82-
current_state: Optional[StateMap[EventBase]] = None,
8381
allow_departed_users: bool = False,
84-
) -> EventBase:
82+
) -> Tuple[str, Optional[str]]:
8583
"""Check if the user is in the room, or was at some point.
8684
Args:
8785
room_id: The room to check.
@@ -99,29 +97,28 @@ async def check_user_in_room(
9997
Raises:
10098
AuthError if the user is/was not in the room.
10199
Returns:
102-
Membership event for the user if the user was in the
103-
room. This will be the join event if they are currently joined to
104-
the room. This will be the leave event if they have left the room.
100+
The current membership of the user in the room and the
101+
membership event ID of the user.
105102
"""
106-
if current_state:
107-
member = current_state.get((EventTypes.Member, user_id), None)
108-
else:
109-
member = await self.state.get_current_state(
110-
room_id=room_id, event_type=EventTypes.Member, state_key=user_id
111-
)
112103

113-
if member:
114-
membership = member.membership
104+
(
105+
membership,
106+
member_event_id,
107+
) = await self.store.get_local_current_membership_for_user_in_room(
108+
user_id=user_id,
109+
room_id=room_id,
110+
)
115111

112+
if membership:
116113
if membership == Membership.JOIN:
117-
return member
114+
return membership, member_event_id
118115

119116
# XXX this looks totally bogus. Why do we not allow users who have been banned,
120117
# or those who were members previously and have been re-invited?
121118
if allow_departed_users and membership == Membership.LEAVE:
122119
forgot = await self.store.did_forget(user_id, room_id)
123120
if not forgot:
124-
return member
121+
return membership, member_event_id
125122

126123
raise AuthError(403, "User %s not in room %s" % (user_id, room_id))
127124

@@ -602,8 +599,11 @@ async def check_can_change_room_list(self, room_id: str, user: UserID) -> bool:
602599
# We currently require the user is a "moderator" in the room. We do this
603600
# by checking if they would (theoretically) be able to change the
604601
# m.room.canonical_alias events
605-
power_level_event = await self.state.get_current_state(
606-
room_id, EventTypes.PowerLevels, ""
602+
603+
power_level_event = (
604+
await self._storage_controllers.state.get_current_state_event(
605+
room_id, EventTypes.PowerLevels, ""
606+
)
607607
)
608608

609609
auth_events = {}
@@ -693,12 +693,11 @@ async def check_user_in_room_or_world_readable(
693693
# * The user is a non-guest user, and was ever in the room
694694
# * The user is a guest user, and has joined the room
695695
# else it will throw.
696-
member_event = await self.check_user_in_room(
696+
return await self.check_user_in_room(
697697
room_id, user_id, allow_departed_users=allow_departed_users
698698
)
699-
return member_event.membership, member_event.event_id
700699
except AuthError:
701-
visibility = await self.state.get_current_state(
700+
visibility = await self._storage_controllers.state.get_current_state_event(
702701
room_id, EventTypes.RoomHistoryVisibility, ""
703702
)
704703
if (

synapse/federation/federation_base.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ def __init__(self, hs: "HomeServer"):
5353
self.spam_checker = hs.get_spam_checker()
5454
self.store = hs.get_datastores().main
5555
self._clock = hs.get_clock()
56+
self._storage_controllers = hs.get_storage_controllers()
5657

5758
async def _check_sigs_and_hash(
5859
self, room_version: RoomVersion, pdu: EventBase

synapse/federation/federation_server.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1223,14 +1223,10 @@ async def check_server_matches_acl(self, server_name: str, room_id: str) -> None
12231223
Raises:
12241224
AuthError if the server does not match the ACL
12251225
"""
1226-
state_ids = await self._state_storage_controller.get_current_state_ids(room_id)
1227-
acl_event_id = state_ids.get((EventTypes.ServerACL, ""))
1228-
1229-
if not acl_event_id:
1230-
return
1231-
1232-
acl_event = await self.store.get_event(acl_event_id)
1233-
if server_matches_acl_event(server_name, acl_event):
1226+
acl_event = await self._storage_controllers.state.get_current_state_event(
1227+
room_id, EventTypes.ServerACL, ""
1228+
)
1229+
if not acl_event or server_matches_acl_event(server_name, acl_event):
12341230
return
12351231

12361232
raise AuthError(code=403, msg="Server is banned from room")

synapse/handlers/directory.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ async def _update_canonical_alias(
320320
Raises:
321321
ShadowBanError if the requester has been shadow-banned.
322322
"""
323-
alias_event = await self.state.get_current_state(
323+
alias_event = await self._storage_controllers.state.get_current_state_event(
324324
room_id, EventTypes.CanonicalAlias, ""
325325
)
326326

synapse/handlers/federation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ async def _maybe_backfill_inner(
371371
# First we try hosts that are already in the room
372372
# TODO: HEURISTIC ALERT.
373373

374-
curr_state = await self.state_handler.get_current_state(room_id)
374+
curr_state = await self._storage_controllers.state.get_current_state(room_id)
375375

376376
curr_domains = get_domains_from_state(curr_state)
377377

synapse/handlers/federation_event.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1584,9 +1584,11 @@ async def _maybe_kick_guest_users(self, event: EventBase) -> None:
15841584
if guest_access == GuestAccess.CAN_JOIN:
15851585
return
15861586

1587-
current_state_map = await self._state_handler.get_current_state(event.room_id)
1588-
current_state = list(current_state_map.values())
1589-
await self._get_room_member_handler().kick_guest_users(current_state)
1587+
current_state = await self._storage_controllers.state.get_current_state(
1588+
event.room_id
1589+
)
1590+
current_state_list = list(current_state.values())
1591+
await self._get_room_member_handler().kick_guest_users(current_state_list)
15901592

15911593
async def _check_for_soft_fail(
15921594
self,
@@ -1614,6 +1616,9 @@ async def _check_for_soft_fail(
16141616
room_version = await self._store.get_room_version_id(event.room_id)
16151617
room_version_obj = KNOWN_ROOM_VERSIONS[room_version]
16161618

1619+
# The event types we want to pull from the "current" state.
1620+
auth_types = auth_types_for_event(room_version_obj, event)
1621+
16171622
# Calculate the "current state".
16181623
if state_ids is not None:
16191624
# If we're explicitly given the state then we won't have all the
@@ -1643,8 +1648,10 @@ async def _check_for_soft_fail(
16431648
)
16441649
)
16451650
else:
1646-
current_state_ids = await self._state_handler.get_current_state_ids(
1647-
event.room_id, latest_event_ids=extrem_ids
1651+
current_state_ids = (
1652+
await self._state_storage_controller.get_current_state_ids(
1653+
event.room_id, StateFilter.from_types(auth_types)
1654+
)
16481655
)
16491656

16501657
logger.debug(
@@ -1654,7 +1661,6 @@ async def _check_for_soft_fail(
16541661
)
16551662

16561663
# Now check if event pass auth against said current state
1657-
auth_types = auth_types_for_event(room_version_obj, event)
16581664
current_state_ids_list = [
16591665
e for k, e in current_state_ids.items() if k in auth_types
16601666
]

synapse/handlers/initial_sync.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ async def handle_room(event: RoomsForUser) -> None:
190190
if event.membership == Membership.JOIN:
191191
room_end_token = now_token.room_key
192192
deferred_room_state = run_in_background(
193-
self.state_handler.get_current_state, event.room_id
193+
self._state_storage_controller.get_current_state, event.room_id
194194
)
195195
elif event.membership == Membership.LEAVE:
196196
room_end_token = RoomStreamToken(
@@ -407,7 +407,9 @@ async def _room_initial_sync_joined(
407407
membership: str,
408408
is_peeking: bool,
409409
) -> JsonDict:
410-
current_state = await self.state.get_current_state(room_id=room_id)
410+
current_state = await self._storage_controllers.state.get_current_state(
411+
room_id=room_id
412+
)
411413

412414
# TODO: These concurrently
413415
time_now = self.clock.time_msec()

synapse/handlers/message.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,9 @@ async def get_room_data(
125125
)
126126

127127
if membership == Membership.JOIN:
128-
data = await self.state.get_current_state(room_id, event_type, state_key)
128+
data = await self._storage_controllers.state.get_current_state_event(
129+
room_id, event_type, state_key
130+
)
129131
elif membership == Membership.LEAVE:
130132
key = (event_type, state_key)
131133
# If the membership is not JOIN, then the event ID should exist.

synapse/handlers/room.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1333,6 +1333,7 @@ def __init__(self, hs: "HomeServer"):
13331333
self.store = hs.get_datastores().main
13341334
self.state_handler = hs.get_state_handler()
13351335
self.federation_client = hs.get_federation_client()
1336+
self._storage_controllers = hs.get_storage_controllers()
13361337

13371338
async def get_event_for_timestamp(
13381339
self,
@@ -1406,7 +1407,9 @@ async def get_event_for_timestamp(
14061407
)
14071408

14081409
# Find other homeservers from the given state in the room
1409-
curr_state = await self.state_handler.get_current_state(room_id)
1410+
curr_state = await self._storage_controllers.state.get_current_state(
1411+
room_id
1412+
)
14101413
curr_domains = get_domains_from_state(curr_state)
14111414
likely_domains = [
14121415
domain for domain, depth in curr_domains if domain != self.server_name

0 commit comments

Comments
 (0)