Compare commits

...

9 Commits

Author SHA1 Message Date
Mathieu Velten
5009830cb2 Use batch version in filter_events_for_server 2023-01-26 15:56:49 +01:00
David Robertson
71c4fd8e08 Run black 2023-01-26 11:05:58 +00:00
David Robertson
e01b43ad78 is_partial_state_rooms -> is_partial_state_room_batched 2023-01-26 11:00:07 +00:00
David Robertson
5c1fe0b20e Also improve the cache size while we're at it 2023-01-26 10:56:33 +00:00
Patrick Cloke
1ce0bd2d77 Clarify comments.
Co-authored-by: Sean Quah <8349537+squahtx@users.noreply.github.com>
2023-01-26 10:43:57 +00:00
Patrick Cloke
528183bb55 Apply suggestions from code review
Co-authored-by: Sean Quah <8349537+squahtx@users.noreply.github.com>
2023-01-26 10:43:53 +00:00
Patrick Cloke
9f4a5c1048 Fix typo. 2023-01-26 10:43:01 +00:00
Patrick Cloke
16487c9b96 Fix issues found in linting. 2023-01-26 10:43:01 +00:00
Patrick Cloke
e8a96bcc39 Batch look-ups to see if rooms are partial stated. 2023-01-26 10:43:01 +00:00
4 changed files with 54 additions and 17 deletions

1
changelog.d/14917.misc Normal file
View File

@@ -0,0 +1 @@
Faster joins: Improve performance of looking up partial-state status of rooms.

View File

@@ -1383,16 +1383,21 @@ class SyncHandler:
if not sync_config.filter_collection.lazy_load_members():
# Non-lazy syncs should never include partially stated rooms.
# Exclude all partially stated rooms from this sync.
for room_id in mutable_joined_room_ids:
if await self.store.is_partial_state_room(room_id):
mutable_rooms_to_exclude.add(room_id)
results = await self.store.is_partial_state_room_batched(
mutable_joined_room_ids
)
mutable_rooms_to_exclude.update(
room_id
for room_id, is_partial_state in results.items()
if is_partial_state
)
# Incremental eager syncs should additionally include rooms that
# - we are joined to
# - are full-stated
# - became fully-stated at some point during the sync period
# (These rooms will have been omitted during a previous eager sync.)
forced_newly_joined_room_ids = set()
forced_newly_joined_room_ids: Set[str] = set()
if since_token and not sync_config.filter_collection.lazy_load_members():
un_partial_stated_rooms = (
await self.store.get_un_partial_stated_rooms_between(
@@ -1401,9 +1406,14 @@ class SyncHandler:
mutable_joined_room_ids,
)
)
for room_id in un_partial_stated_rooms:
if not await self.store.is_partial_state_room(room_id):
forced_newly_joined_room_ids.add(room_id)
results = await self.store.is_partial_state_room_batched(
un_partial_stated_rooms
)
forced_newly_joined_room_ids.update(
room_id
for room_id, is_partial_state in results.items()
if not is_partial_state
)
# Now we have our list of joined room IDs, exclude as configured and freeze
joined_room_ids = frozenset(

View File

@@ -60,9 +60,9 @@ from synapse.storage.util.id_generators import (
MultiWriterIdGenerator,
StreamIdGenerator,
)
from synapse.types import JsonDict, RetentionPolicy, ThirdPartyInstanceID
from synapse.types import JsonDict, RetentionPolicy, StrCollection, ThirdPartyInstanceID
from synapse.util import json_encoder
from synapse.util.caches.descriptors import cached
from synapse.util.caches.descriptors import cached, cachedList
from synapse.util.stringutils import MXC_REGEX
if TYPE_CHECKING:
@@ -1255,7 +1255,7 @@ class RoomWorkerStore(CacheInvalidationWorkerStore):
return room_servers
@cached()
@cached(max_entries=10000)
async def is_partial_state_room(self, room_id: str) -> bool:
"""Checks if this room has partial state.
@@ -1274,6 +1274,29 @@ class RoomWorkerStore(CacheInvalidationWorkerStore):
return entry is not None
@cachedList(cached_method_name="is_partial_state_room", list_name="room_ids")
async def is_partial_state_room_batched(
self, room_ids: StrCollection
) -> Mapping[str, bool]:
"""Checks if the given rooms have partial state.
Returns true for "partial-state" rooms, which means that the state
at events in the room, and `current_state_events`, may not yet be
complete.
"""
entries = set(
await self.db_pool.simple_select_many_batch(
table="partial_state_rooms",
column="room_id",
iterable=room_ids,
retcols=("room_id",),
desc="is_partial_state_room",
)
)
return {room_id: room_id in entries for room_id in room_ids}
async def get_join_event_id_and_device_lists_stream_id_for_partial_state(
self, room_id: str
) -> Tuple[str, int]:

View File

@@ -631,15 +631,18 @@ async def filter_events_for_server(
# otherwise a room could be fully joined after we retrieve those, which would then bypass
# this check but would base the filtering on an outdated view of the membership events.
partial_state_invisible_events = set()
partial_stated_room_ids = set()
if not check_history_visibility_only:
room_ids_to_check: List[str] = []
for e in events:
sender_domain = get_domain_from_id(e.sender)
if (
sender_domain != local_server_name
and await storage.main.is_partial_state_room(e.room_id)
):
partial_state_invisible_events.add(e)
if sender_domain != local_server_name:
room_ids_to_check.append(e.room_id)
results = await storage.main.is_partial_state_room_batched(room_ids_to_check)
for room_id, is_partial_state in results.items():
if is_partial_state:
partial_stated_room_ids.add(room_id)
# Let's check to see if all the events have a history visibility
# of "shared" or "world_readable". If that's the case then we don't
@@ -665,7 +668,7 @@ async def filter_events_for_server(
event_to_history_vis[e.event_id], event_to_memberships.get(e.event_id, {})
)
if e in partial_state_invisible_events:
if e.room_id in partial_stated_room_ids:
visible = False
if visible and not erased: