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

Commit 8553f46

Browse files
authored
Convert a synapse.events to async/await. (#7949)
1 parent 5f65e62 commit 8553f46

File tree

13 files changed

+86
-82
lines changed

13 files changed

+86
-82
lines changed

changelog.d/7948.misc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Convert push to async/await.
1+
Convert various parts of the codebase to async/await.

changelog.d/7949.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Convert various parts of the codebase to async/await.

changelog.d/7951.misc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Convert groups and visibility code to async / await.
1+
Convert various parts of the codebase to async/await.

synapse/api/auth.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def __init__(self, hs):
8282

8383
@defer.inlineCallbacks
8484
def check_from_context(self, room_version: str, event, context, do_sig_check=True):
85-
prev_state_ids = yield context.get_prev_state_ids()
85+
prev_state_ids = yield defer.ensureDeferred(context.get_prev_state_ids())
8686
auth_events_ids = yield self.compute_auth_events(
8787
event, prev_state_ids, for_verification=True
8888
)

synapse/events/builder.py

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717
import attr
1818
from nacl.signing import SigningKey
1919

20-
from twisted.internet import defer
21-
2220
from synapse.api.constants import MAX_DEPTH
2321
from synapse.api.errors import UnsupportedRoomVersionError
2422
from synapse.api.room_versions import (
@@ -95,31 +93,30 @@ def state_key(self):
9593
def is_state(self):
9694
return self._state_key is not None
9795

98-
@defer.inlineCallbacks
99-
def build(self, prev_event_ids):
96+
async def build(self, prev_event_ids):
10097
"""Transform into a fully signed and hashed event
10198
10299
Args:
103100
prev_event_ids (list[str]): The event IDs to use as the prev events
104101
105102
Returns:
106-
Deferred[FrozenEvent]
103+
FrozenEvent
107104
"""
108105

109-
state_ids = yield defer.ensureDeferred(
110-
self._state.get_current_state_ids(self.room_id, prev_event_ids)
106+
state_ids = await self._state.get_current_state_ids(
107+
self.room_id, prev_event_ids
111108
)
112-
auth_ids = yield self._auth.compute_auth_events(self, state_ids)
109+
auth_ids = await self._auth.compute_auth_events(self, state_ids)
113110

114111
format_version = self.room_version.event_format
115112
if format_version == EventFormatVersions.V1:
116-
auth_events = yield self._store.add_event_hashes(auth_ids)
117-
prev_events = yield self._store.add_event_hashes(prev_event_ids)
113+
auth_events = await self._store.add_event_hashes(auth_ids)
114+
prev_events = await self._store.add_event_hashes(prev_event_ids)
118115
else:
119116
auth_events = auth_ids
120117
prev_events = prev_event_ids
121118

122-
old_depth = yield self._store.get_max_depth_of(prev_event_ids)
119+
old_depth = await self._store.get_max_depth_of(prev_event_ids)
123120
depth = old_depth + 1
124121

125122
# we cap depth of generated events, to ensure that they are not

synapse/events/snapshot.py

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,19 @@
1212
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
15-
from typing import Optional, Union
15+
from typing import TYPE_CHECKING, Optional, Union
1616

1717
import attr
1818
from frozendict import frozendict
1919

20-
from twisted.internet import defer
21-
2220
from synapse.appservice import ApplicationService
21+
from synapse.events import EventBase
2322
from synapse.logging.context import make_deferred_yieldable, run_in_background
2423
from synapse.types import StateMap
2524

25+
if TYPE_CHECKING:
26+
from synapse.storage.data_stores.main import DataStore
27+
2628

2729
@attr.s(slots=True)
2830
class EventContext:
@@ -129,8 +131,7 @@ def with_state(
129131
delta_ids=delta_ids,
130132
)
131133

132-
@defer.inlineCallbacks
133-
def serialize(self, event, store):
134+
async def serialize(self, event: EventBase, store: "DataStore") -> dict:
134135
"""Converts self to a type that can be serialized as JSON, and then
135136
deserialized by `deserialize`
136137
@@ -146,7 +147,7 @@ def serialize(self, event, store):
146147
# the prev_state_ids, so if we're a state event we include the event
147148
# id that we replaced in the state.
148149
if event.is_state():
149-
prev_state_ids = yield self.get_prev_state_ids()
150+
prev_state_ids = await self.get_prev_state_ids()
150151
prev_state_id = prev_state_ids.get((event.type, event.state_key))
151152
else:
152153
prev_state_id = None
@@ -214,8 +215,7 @@ def state_group(self) -> Optional[int]:
214215

215216
return self._state_group
216217

217-
@defer.inlineCallbacks
218-
def get_current_state_ids(self):
218+
async def get_current_state_ids(self) -> Optional[StateMap[str]]:
219219
"""
220220
Gets the room state map, including this event - ie, the state in ``state_group``
221221
@@ -224,32 +224,31 @@ def get_current_state_ids(self):
224224
``rejected`` is set.
225225
226226
Returns:
227-
Deferred[dict[(str, str), str]|None]: Returns None if state_group
228-
is None, which happens when the associated event is an outlier.
227+
Returns None if state_group is None, which happens when the associated
228+
event is an outlier.
229229
230-
Maps a (type, state_key) to the event ID of the state event matching
231-
this tuple.
230+
Maps a (type, state_key) to the event ID of the state event matching
231+
this tuple.
232232
"""
233233
if self.rejected:
234234
raise RuntimeError("Attempt to access state_ids of rejected event")
235235

236-
yield self._ensure_fetched()
236+
await self._ensure_fetched()
237237
return self._current_state_ids
238238

239-
@defer.inlineCallbacks
240-
def get_prev_state_ids(self):
239+
async def get_prev_state_ids(self):
241240
"""
242241
Gets the room state map, excluding this event.
243242
244243
For a non-state event, this will be the same as get_current_state_ids().
245244
246245
Returns:
247-
Deferred[dict[(str, str), str]|None]: Returns None if state_group
246+
dict[(str, str), str]|None: Returns None if state_group
248247
is None, which happens when the associated event is an outlier.
249248
Maps a (type, state_key) to the event ID of the state event matching
250249
this tuple.
251250
"""
252-
yield self._ensure_fetched()
251+
await self._ensure_fetched()
253252
return self._prev_state_ids
254253

255254
def get_cached_current_state_ids(self):
@@ -269,8 +268,8 @@ def get_cached_current_state_ids(self):
269268

270269
return self._current_state_ids
271270

272-
def _ensure_fetched(self):
273-
return defer.succeed(None)
271+
async def _ensure_fetched(self):
272+
return None
274273

275274

276275
@attr.s(slots=True)
@@ -303,21 +302,20 @@ class _AsyncEventContextImpl(EventContext):
303302
_event_state_key = attr.ib(default=None)
304303
_fetching_state_deferred = attr.ib(default=None)
305304

306-
def _ensure_fetched(self):
305+
async def _ensure_fetched(self):
307306
if not self._fetching_state_deferred:
308307
self._fetching_state_deferred = run_in_background(self._fill_out_state)
309308

310-
return make_deferred_yieldable(self._fetching_state_deferred)
309+
return await make_deferred_yieldable(self._fetching_state_deferred)
311310

312-
@defer.inlineCallbacks
313-
def _fill_out_state(self):
311+
async def _fill_out_state(self):
314312
"""Called to populate the _current_state_ids and _prev_state_ids
315313
attributes by loading from the database.
316314
"""
317315
if self.state_group is None:
318316
return
319317

320-
self._current_state_ids = yield self._storage.state.get_state_ids_for_group(
318+
self._current_state_ids = await self._storage.state.get_state_ids_for_group(
321319
self.state_group
322320
)
323321
if self._event_state_key is not None:

synapse/events/third_party_rules.py

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515

16-
from twisted.internet import defer
16+
from synapse.events import EventBase
17+
from synapse.events.snapshot import EventContext
18+
from synapse.types import Requester
1719

1820

1921
class ThirdPartyEventRules(object):
@@ -39,76 +41,79 @@ def __init__(self, hs):
3941
config=config, http_client=hs.get_simple_http_client()
4042
)
4143

42-
@defer.inlineCallbacks
43-
def check_event_allowed(self, event, context):
44+
async def check_event_allowed(
45+
self, event: EventBase, context: EventContext
46+
) -> bool:
4447
"""Check if a provided event should be allowed in the given context.
4548
4649
Args:
47-
event (synapse.events.EventBase): The event to be checked.
48-
context (synapse.events.snapshot.EventContext): The context of the event.
50+
event: The event to be checked.
51+
context: The context of the event.
4952
5053
Returns:
51-
defer.Deferred[bool]: True if the event should be allowed, False if not.
54+
True if the event should be allowed, False if not.
5255
"""
5356
if self.third_party_rules is None:
5457
return True
5558

56-
prev_state_ids = yield context.get_prev_state_ids()
59+
prev_state_ids = await context.get_prev_state_ids()
5760

5861
# Retrieve the state events from the database.
5962
state_events = {}
6063
for key, event_id in prev_state_ids.items():
61-
state_events[key] = yield self.store.get_event(event_id, allow_none=True)
64+
state_events[key] = await self.store.get_event(event_id, allow_none=True)
6265

63-
ret = yield self.third_party_rules.check_event_allowed(event, state_events)
66+
ret = await self.third_party_rules.check_event_allowed(event, state_events)
6467
return ret
6568

66-
@defer.inlineCallbacks
67-
def on_create_room(self, requester, config, is_requester_admin):
69+
async def on_create_room(
70+
self, requester: Requester, config: dict, is_requester_admin: bool
71+
) -> bool:
6872
"""Intercept requests to create room to allow, deny or update the
6973
request config.
7074
7175
Args:
72-
requester (Requester)
73-
config (dict): The creation config from the client.
74-
is_requester_admin (bool): If the requester is an admin
76+
requester
77+
config: The creation config from the client.
78+
is_requester_admin: If the requester is an admin
7579
7680
Returns:
77-
defer.Deferred[bool]: Whether room creation is allowed or denied.
81+
Whether room creation is allowed or denied.
7882
"""
7983

8084
if self.third_party_rules is None:
8185
return True
8286

83-
ret = yield self.third_party_rules.on_create_room(
87+
ret = await self.third_party_rules.on_create_room(
8488
requester, config, is_requester_admin
8589
)
8690
return ret
8791

88-
@defer.inlineCallbacks
89-
def check_threepid_can_be_invited(self, medium, address, room_id):
92+
async def check_threepid_can_be_invited(
93+
self, medium: str, address: str, room_id: str
94+
) -> bool:
9095
"""Check if a provided 3PID can be invited in the given room.
9196
9297
Args:
93-
medium (str): The 3PID's medium.
94-
address (str): The 3PID's address.
95-
room_id (str): The room we want to invite the threepid to.
98+
medium: The 3PID's medium.
99+
address: The 3PID's address.
100+
room_id: The room we want to invite the threepid to.
96101
97102
Returns:
98-
defer.Deferred[bool], True if the 3PID can be invited, False if not.
103+
True if the 3PID can be invited, False if not.
99104
"""
100105

101106
if self.third_party_rules is None:
102107
return True
103108

104-
state_ids = yield self.store.get_filtered_current_state_ids(room_id)
105-
room_state_events = yield self.store.get_events(state_ids.values())
109+
state_ids = await self.store.get_filtered_current_state_ids(room_id)
110+
room_state_events = await self.store.get_events(state_ids.values())
106111

107112
state_events = {}
108113
for key, event_id in state_ids.items():
109114
state_events[key] = room_state_events[event_id]
110115

111-
ret = yield self.third_party_rules.check_threepid_can_be_invited(
116+
ret = await self.third_party_rules.check_threepid_can_be_invited(
112117
medium, address, state_events
113118
)
114119
return ret

synapse/events/utils.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818

1919
from frozendict import frozendict
2020

21-
from twisted.internet import defer
22-
2321
from synapse.api.constants import EventTypes, RelationTypes
2422
from synapse.api.errors import Codes, SynapseError
2523
from synapse.api.room_versions import RoomVersion
@@ -337,8 +335,9 @@ def __init__(self, hs):
337335
hs.config.experimental_msc1849_support_enabled
338336
)
339337

340-
@defer.inlineCallbacks
341-
def serialize_event(self, event, time_now, bundle_aggregations=True, **kwargs):
338+
async def serialize_event(
339+
self, event, time_now, bundle_aggregations=True, **kwargs
340+
):
342341
"""Serializes a single event.
343342
344343
Args:
@@ -348,7 +347,7 @@ def serialize_event(self, event, time_now, bundle_aggregations=True, **kwargs):
348347
**kwargs: Arguments to pass to `serialize_event`
349348
350349
Returns:
351-
Deferred[dict]: The serialized event
350+
dict: The serialized event
352351
"""
353352
# To handle the case of presence events and the like
354353
if not isinstance(event, EventBase):
@@ -363,8 +362,8 @@ def serialize_event(self, event, time_now, bundle_aggregations=True, **kwargs):
363362
if not event.internal_metadata.is_redacted() and (
364363
self.experimental_msc1849_support_enabled and bundle_aggregations
365364
):
366-
annotations = yield self.store.get_aggregation_groups_for_event(event_id)
367-
references = yield self.store.get_relations_for_event(
365+
annotations = await self.store.get_aggregation_groups_for_event(event_id)
366+
references = await self.store.get_relations_for_event(
368367
event_id, RelationTypes.REFERENCE, direction="f"
369368
)
370369

@@ -378,7 +377,7 @@ def serialize_event(self, event, time_now, bundle_aggregations=True, **kwargs):
378377

379378
edit = None
380379
if event.type == EventTypes.Message:
381-
edit = yield self.store.get_applicable_edit(event_id)
380+
edit = await self.store.get_applicable_edit(event_id)
382381

383382
if edit:
384383
# If there is an edit replace the content, preserving existing

synapse/handlers/federation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2470,7 +2470,7 @@ async def _update_context_for_auth_events(
24702470
}
24712471

24722472
current_state_ids = await context.get_current_state_ids()
2473-
current_state_ids = dict(current_state_ids)
2473+
current_state_ids = dict(current_state_ids) # type: ignore
24742474

24752475
current_state_ids.update(state_updates)
24762476

synapse/replication/http/federation.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,9 @@ def _serialize_payload(store, event_and_contexts, backfilled):
7878
"""
7979
event_payloads = []
8080
for event, context in event_and_contexts:
81-
serialized_context = yield context.serialize(event, store)
81+
serialized_context = yield defer.ensureDeferred(
82+
context.serialize(event, store)
83+
)
8284

8385
event_payloads.append(
8486
{

0 commit comments

Comments
 (0)