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

Convert room members storage tuples to attrs. #10629

Merged
merged 6 commits into from
Aug 18, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/10629.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Convert room member storage tuples to `attrs` classes.
2 changes: 1 addition & 1 deletion synapse/handlers/initial_sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ async def _snapshot_all_rooms(
limit = 10

async def handle_room(event: RoomsForUser):
d = {
d: JsonDict = {
"room_id": event.room_id,
"membership": event.membership,
"visibility": (
Expand Down
18 changes: 10 additions & 8 deletions synapse/handlers/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -701,7 +701,7 @@ async def compute_summary(
name_id = state_ids.get((EventTypes.Name, ""))
canonical_alias_id = state_ids.get((EventTypes.CanonicalAlias, ""))

summary = {}
summary: JsonDict = {}
empty_ms = MemberSummary([], 0)

# TODO: only send these when they change.
Expand Down Expand Up @@ -2076,21 +2076,23 @@ async def get_rooms_for_user_at(
# If the membership's stream ordering is after the given stream
# ordering, we need to go and work out if the user was in the room
# before.
for room_id, event_pos in joined_rooms:
if not event_pos.persisted_after(room_key):
joined_room_ids.add(room_id)
for joined_room in joined_rooms:
if not joined_room.event_pos.persisted_after(room_key):
joined_room_ids.add(joined_room.room_id)
continue

logger.info("User joined room after current token: %s", room_id)
logger.info("User joined room after current token: %s", joined_room.room_id)

extrems = (
await self.store.get_forward_extremities_for_room_at_stream_ordering(
room_id, event_pos.stream
joined_room.room_id, joined_room.event_pos.stream
)
)
users_in_room = await self.state.get_current_users_in_room(room_id, extrems)
users_in_room = await self.state.get_current_users_in_room(
joined_room.room_id, extrems
)
if user_id in users_in_room:
joined_room_ids.add(room_id)
joined_room_ids.add(joined_room.room_id)

return frozenset(joined_room_ids)

Expand Down
8 changes: 6 additions & 2 deletions synapse/storage/databases/main/roommember.py
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,9 @@ def _get_room_summary_txn(txn):
)

@cached()
async def get_invited_rooms_for_local_user(self, user_id: str) -> RoomsForUser:
async def get_invited_rooms_for_local_user(
self, user_id: str
) -> List[RoomsForUser]:
"""Get all the rooms the *local* user is invited to.

Args:
Expand Down Expand Up @@ -522,7 +524,9 @@ def _get_users_server_still_shares_room_with_txn(txn):
_get_users_server_still_shares_room_with_txn,
)

async def get_rooms_for_user(self, user_id: str, on_invalidate=None):
async def get_rooms_for_user(
self, user_id: str, on_invalidate=None
) -> FrozenSet[str]:
"""Returns a set of room_ids the user is currently joined to.

If a remote user only returns rooms this server is currently
Expand Down
2 changes: 1 addition & 1 deletion synapse/storage/databases/main/user_directory.py
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@ async def is_room_world_readable_or_publicly_joinable(self, room_id):
return False

async def update_profile_in_user_dir(
self, user_id: str, display_name: str, avatar_url: str
self, user_id: str, display_name: Optional[str], avatar_url: Optional[str]
) -> None:
"""
Update or add a user's profile in the user directory.
Expand Down
43 changes: 29 additions & 14 deletions synapse/storage/roommember.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,25 +14,40 @@
# limitations under the License.

import logging
from collections import namedtuple
from typing import List, Optional, Tuple

import attr

from synapse.types import PersistedEventPosition

logger = logging.getLogger(__name__)


RoomsForUser = namedtuple(
"RoomsForUser", ("room_id", "sender", "membership", "event_id", "stream_ordering")
)
@attr.s(slots=True, frozen=True, weakref_slot=True, auto_attribs=True)
class RoomsForUser:
room_id: str
sender: str
membership: str
event_id: str
stream_ordering: int


@attr.s(slots=True, frozen=True, weakref_slot=True, auto_attribs=True)
class GetRoomsForUserWithStreamOrdering:
room_id: str
event_pos: PersistedEventPosition

GetRoomsForUserWithStreamOrdering = namedtuple(
"GetRoomsForUserWithStreamOrdering", ("room_id", "event_pos")
)

@attr.s(slots=True, frozen=True, weakref_slot=True, auto_attribs=True)
class ProfileInfo:
avatar_url: Optional[str]
display_name: Optional[str]

# We store this using a namedtuple so that we save about 3x space over using a
# dict.
ProfileInfo = namedtuple("ProfileInfo", ("avatar_url", "display_name"))

# "members" points to a truncated list of (user_id, event_id) tuples for users of
# a given membership type, suitable for use in calculating heroes for a room.
# "count" points to the total numberr of users of a given membership type.
MemberSummary = namedtuple("MemberSummary", ("members", "count"))
@attr.s(slots=True, frozen=True, weakref_slot=True, auto_attribs=True)
class MemberSummary:
# A truncated list of (user_id, event_id) tuples for users of a given
# membership type, suitable for use in calculating heroes for a room.
members: List[Tuple[str, str]]
# The total number of users of a given membership type.
count: int
9 changes: 6 additions & 3 deletions tests/replication/slave/storage/test_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
from synapse.events import FrozenEvent, _EventInternalMetadata, make_event_from_dict
from synapse.handlers.room import RoomEventSource
from synapse.replication.slave.storage.events import SlavedEventStore
from synapse.storage.roommember import RoomsForUser
from synapse.storage.roommember import GetRoomsForUserWithStreamOrdering, RoomsForUser
from synapse.types import PersistedEventPosition

from tests.server import FakeTransport
Expand Down Expand Up @@ -216,7 +216,7 @@ def test_get_rooms_for_user_with_stream_ordering(self):
self.check(
"get_rooms_for_user_with_stream_ordering",
(USER_ID_2,),
{(ROOM_ID, expected_pos)},
{GetRoomsForUserWithStreamOrdering(ROOM_ID, expected_pos)},
)

def test_get_rooms_for_user_with_stream_ordering_with_multi_event_persist(self):
Expand Down Expand Up @@ -305,7 +305,10 @@ def test_get_rooms_for_user_with_stream_ordering_with_multi_event_persist(self):
expected_pos = PersistedEventPosition(
"master", j2.internal_metadata.stream_ordering
)
self.assertEqual(joined_rooms, {(ROOM_ID, expected_pos)})
self.assertEqual(
joined_rooms,
{GetRoomsForUserWithStreamOrdering(ROOM_ID, expected_pos)},
)

event_id = 0

Expand Down