From 789cce4e1f670144edea47175063f0eb74f58c4c Mon Sep 17 00:00:00 2001 From: Patrick Cloke Date: Fri, 17 Jul 2020 15:17:53 -0400 Subject: [PATCH 1/6] Convert presence. --- synapse/federation/sender/__init__.py | 4 +++- synapse/handlers/presence.py | 20 +++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/synapse/federation/sender/__init__.py b/synapse/federation/sender/__init__.py index b328a4df096c..99ce73e08181 100644 --- a/synapse/federation/sender/__init__.py +++ b/synapse/federation/sender/__init__.py @@ -453,7 +453,9 @@ def _process_presence_inner(self, states: List[UserPresenceState]): """Given a list of states populate self.pending_presence_by_dest and poke to send a new transaction to each destination """ - hosts_and_states = yield get_interested_remotes(self.store, states, self.state) + hosts_and_states = yield defer.ensureDeferred( + get_interested_remotes(self.store, states, self.state) + ) for destinations, states in hosts_and_states: for destination in destinations: diff --git a/synapse/handlers/presence.py b/synapse/handlers/presence.py index d2f25ae12ab5..7158fa42f857 100644 --- a/synapse/handlers/presence.py +++ b/synapse/handlers/presence.py @@ -30,8 +30,6 @@ from prometheus_client import Counter from typing_extensions import ContextManager -from twisted.internet import defer - import synapse.metrics from synapse.api.constants import EventTypes, Membership, PresenceState from synapse.api.errors import SynapseError @@ -1296,13 +1294,14 @@ def handle_update(prev_state, new_state, is_mine, wheel_timer, now): return new_state, persist_and_notify, federation_ping -@defer.inlineCallbacks -def get_interested_parties(store, states): +async def get_interested_parties( + store, states: List[UserPresenceState] +) -> Tuple[Dict[str, List[UserPresenceState]], Dict[str, List[UserPresenceState]]]: """Given a list of states return which entities (rooms, users) are interested in the given states. Args: - states (list(UserPresenceState)) + states Returns: 2-tuple: `(room_ids_to_states, users_to_states)`, @@ -1311,7 +1310,7 @@ def get_interested_parties(store, states): room_ids_to_states = {} # type: Dict[str, List[UserPresenceState]] users_to_states = {} # type: Dict[str, List[UserPresenceState]] for state in states: - room_ids = yield store.get_rooms_for_user(state.user_id) + room_ids = await store.get_rooms_for_user(state.user_id) for room_id in room_ids: room_ids_to_states.setdefault(room_id, []).append(state) @@ -1321,8 +1320,7 @@ def get_interested_parties(store, states): return room_ids_to_states, users_to_states -@defer.inlineCallbacks -def get_interested_remotes(store, states, state_handler): +async def get_interested_remotes(store, states, state_handler): """Given a list of presence states figure out which remote servers should be sent which. @@ -1333,7 +1331,7 @@ def get_interested_remotes(store, states, state_handler): states (list(UserPresenceState)) Returns: - Deferred list of ([destinations], [UserPresenceState]), where for + A list of ([destinations], [UserPresenceState]), where for each row the list of UserPresenceState should be sent to each destination """ @@ -1342,10 +1340,10 @@ def get_interested_remotes(store, states, state_handler): # First we look up the rooms each user is in (as well as any explicit # subscriptions), then for each distinct room we look up the remote # hosts in those rooms. - room_ids_to_states, users_to_states = yield get_interested_parties(store, states) + room_ids_to_states, users_to_states = await get_interested_parties(store, states) for room_id, states in room_ids_to_states.items(): - hosts = yield state_handler.get_current_hosts_in_room(room_id) + hosts = await state_handler.get_current_hosts_in_room(room_id) hosts_and_states.append((hosts, states)) for user_id, states in users_to_states.items(): From daf38f68cf7149f64368abad07c593dd5fb2dd8d Mon Sep 17 00:00:00 2001 From: Patrick Cloke Date: Wed, 22 Jul 2020 14:01:17 -0400 Subject: [PATCH 2/6] Remove an additional Deferred reference. --- synapse/handlers/presence.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/synapse/handlers/presence.py b/synapse/handlers/presence.py index 7158fa42f857..02dffcaeb639 100644 --- a/synapse/handlers/presence.py +++ b/synapse/handlers/presence.py @@ -893,16 +893,9 @@ async def _handle_state_delta(self, deltas): await self._on_user_joined_room(room_id, state_key) - async def _on_user_joined_room(self, room_id, user_id): + async def _on_user_joined_room(self, room_id: str, user_id: str) -> None: """Called when we detect a user joining the room via the current state delta stream. - - Args: - room_id (str) - user_id (str) - - Returns: - Deferred """ if self.is_mine_id(user_id): From 91310120f4b5fd0a1128933c17370ab91f25563b Mon Sep 17 00:00:00 2001 From: Patrick Cloke Date: Thu, 23 Jul 2020 14:06:04 -0400 Subject: [PATCH 3/6] Add more type information. --- synapse/handlers/presence.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/synapse/handlers/presence.py b/synapse/handlers/presence.py index 02dffcaeb639..588c5372f7cf 100644 --- a/synapse/handlers/presence.py +++ b/synapse/handlers/presence.py @@ -37,6 +37,8 @@ from synapse.logging.utils import log_function from synapse.metrics import LaterGauge from synapse.metrics.background_process_metrics import run_as_background_process +from synapse.state import StateHandler +from synapse.storage.data_stores.main import DataStore from synapse.storage.presence import UserPresenceState from synapse.types import JsonDict, UserID, get_domain_from_id from synapse.util.async_helpers import Linearizer @@ -1313,19 +1315,22 @@ async def get_interested_parties( return room_ids_to_states, users_to_states -async def get_interested_remotes(store, states, state_handler): +async def get_interested_remotes( + store: DataStore, states: List[UserPresenceState], state_handler: StateHandler +) -> List[Tuple[List[str], List[UserPresenceState]]]: """Given a list of presence states figure out which remote servers should be sent which. All the presence states should be for local users only. Args: - store (DataStore) - states (list(UserPresenceState)) + store + states + state_handler Returns: - A list of ([destinations], [UserPresenceState]), where for - each row the list of UserPresenceState should be sent to each + A list of 2-tuples of destinations and states, where for + each tuple the list of UserPresenceState should be sent to each destination """ hosts_and_states = [] From fd356f45b78e8741ecbb4494941e58756c6ce6f2 Mon Sep 17 00:00:00 2001 From: Patrick Cloke Date: Thu, 23 Jul 2020 14:07:39 -0400 Subject: [PATCH 4/6] Add a changelog. --- changelog.d/7939.misc | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/7939.misc diff --git a/changelog.d/7939.misc b/changelog.d/7939.misc new file mode 100644 index 000000000000..798833b3af56 --- /dev/null +++ b/changelog.d/7939.misc @@ -0,0 +1 @@ +Convert presence handler helpers to async/await. From d922e364ef0dc8ee360dfc4cb8c776a762eb0102 Mon Sep 17 00:00:00 2001 From: Patrick Cloke Date: Thu, 23 Jul 2020 14:08:33 -0400 Subject: [PATCH 5/6] Add another type hint. --- synapse/handlers/presence.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/synapse/handlers/presence.py b/synapse/handlers/presence.py index 588c5372f7cf..ba027ea08a0a 100644 --- a/synapse/handlers/presence.py +++ b/synapse/handlers/presence.py @@ -1290,12 +1290,13 @@ def handle_update(prev_state, new_state, is_mine, wheel_timer, now): async def get_interested_parties( - store, states: List[UserPresenceState] + store: DataStore, states: List[UserPresenceState] ) -> Tuple[Dict[str, List[UserPresenceState]], Dict[str, List[UserPresenceState]]]: """Given a list of states return which entities (rooms, users) are interested in the given states. Args: + store states Returns: From 02aa64f3ea55c3416013b8756a8a99bad4e6032a Mon Sep 17 00:00:00 2001 From: Patrick Cloke Date: Thu, 23 Jul 2020 16:47:20 -0400 Subject: [PATCH 6/6] Update docstring. Co-authored-by: Andrew Morgan <1342360+anoadragon453@users.noreply.github.com> --- synapse/handlers/presence.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/synapse/handlers/presence.py b/synapse/handlers/presence.py index ba027ea08a0a..8e99c83d9db3 100644 --- a/synapse/handlers/presence.py +++ b/synapse/handlers/presence.py @@ -1300,7 +1300,7 @@ async def get_interested_parties( states Returns: - 2-tuple: `(room_ids_to_states, users_to_states)`, + A 2-tuple of `(room_ids_to_states, users_to_states)`, with each item being a dict of `entity_name` -> `[UserPresenceState]` """ room_ids_to_states = {} # type: Dict[str, List[UserPresenceState]]