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

Convert the message handler to async/await #7884

Merged
merged 16 commits into from
Jul 22, 2020
29 changes: 14 additions & 15 deletions synapse/handlers/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@

from canonicaljson import encode_canonical_json, json

from twisted.internet import defer
from twisted.internet.interfaces import IDelayedCall

from synapse import event_auth
Expand Down Expand Up @@ -467,7 +466,7 @@ async def create_event(
ResourceLimitError if server is blocked to some resource being
exceeded
Returns:
Tuple of created event (FrozenEvent), Context
Tuple of created event, Context
"""
await self.auth.check_auth_blocking(requester.user.to_string())

Expand Down Expand Up @@ -736,25 +735,25 @@ async def create_and_send_nonmember_event(
return event, stream_id

@measure_func("create_new_client_event")
@defer.inlineCallbacks
def create_new_client_event(
self, builder, requester=None, prev_event_ids: Optional[Collection[str]] = None
):
async def create_new_client_event(
self,
builder: EventBuilder,
requester: Optional[Requester] = None,
prev_event_ids: Optional[Collection[str]] = None,
) -> Tuple[EventBase, EventContext]:
anoadragon453 marked this conversation as resolved.
Show resolved Hide resolved
"""Create a new event for a local client

Args:
builder (EventBuilder):

requester (synapse.types.Requester|None):

builder:
requester:
prev_event_ids:
the forward extremities to use as the prev_events for the
new event.

If None, they will be requested from the database.

Returns:
Deferred[(synapse.events.EventBase, synapse.events.snapshot.EventContext)]
Tuple of created event, Context
clokep marked this conversation as resolved.
Show resolved Hide resolved
"""

if prev_event_ids is not None:
Expand All @@ -763,10 +762,10 @@ def create_new_client_event(
% (len(prev_event_ids),)
)
else:
prev_event_ids = yield self.store.get_prev_events_for_room(builder.room_id)
prev_event_ids = await self.store.get_prev_events_for_room(builder.room_id)

event = yield builder.build(prev_event_ids=prev_event_ids)
context = yield self.state.compute_event_context(event)
event = await builder.build(prev_event_ids=prev_event_ids)
context = await self.state.compute_event_context(event)
if requester:
context.app_service = requester.app_service

Expand All @@ -780,7 +779,7 @@ def create_new_client_event(
relates_to = relation["event_id"]
aggregation_key = relation["key"]

already_exists = yield self.store.has_user_annotated_event(
already_exists = await self.store.has_user_annotated_event(
relates_to, event.type, aggregation_key, event.sender
)
if already_exists:
Expand Down
36 changes: 21 additions & 15 deletions tests/events/test_snapshot.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,10 @@ def test_serialize_deserialize_msg(self):
serialize/deserialize.
"""

event, context = create_event(
self.hs, room_id=self.room_id, type="m.test", sender=self.user_id,
event, context = self.get_success(
create_event(
self.hs, room_id=self.room_id, type="m.test", sender=self.user_id,
)
)

self._check_serialize_deserialize(event, context)
Expand All @@ -51,12 +53,14 @@ def test_serialize_deserialize_state_no_prev(self):
"""Test that an EventContext for a state event (with not previous entry)
is the same after serialize/deserialize.
"""
event, context = create_event(
self.hs,
room_id=self.room_id,
type="m.test",
sender=self.user_id,
state_key="",
event, context = self.get_success(
create_event(
self.hs,
room_id=self.room_id,
type="m.test",
sender=self.user_id,
state_key="",
)
)

self._check_serialize_deserialize(event, context)
Expand All @@ -65,13 +69,15 @@ def test_serialize_deserialize_state_prev(self):
"""Test that an EventContext for a state event (which replaces a
previous entry) is the same after serialize/deserialize.
"""
event, context = create_event(
self.hs,
room_id=self.room_id,
type="m.room.member",
sender=self.user_id,
state_key=self.user_id,
content={"membership": "leave"},
event, context = self.get_success(
create_event(
self.hs,
room_id=self.room_id,
type="m.room.member",
sender=self.user_id,
state_key=self.user_id,
content={"membership": "leave"},
)
)

self._check_serialize_deserialize(event, context)
Expand Down
76 changes: 44 additions & 32 deletions tests/replication/tcp/streams/test_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,9 @@ def test_update_function_huge_state_change(self):
OTHER_USER = "@other_user:localhost"

# have the user join
inject_member_event(self.hs, self.room_id, OTHER_USER, Membership.JOIN)
self.get_success(
inject_member_event(self.hs, self.room_id, OTHER_USER, Membership.JOIN)
)

# Update existing power levels with mod at PL50
pls = self.helper.get_state(
Expand Down Expand Up @@ -157,14 +159,16 @@ def test_update_function_huge_state_change(self):
# roll back all the state by de-modding the user
prev_events = fork_point
pls["users"][OTHER_USER] = 0
pl_event = inject_event(
self.hs,
prev_event_ids=prev_events,
type=EventTypes.PowerLevels,
state_key="",
sender=self.user_id,
room_id=self.room_id,
content=pls,
pl_event = self.get_success(
inject_event(
self.hs,
prev_event_ids=prev_events,
type=EventTypes.PowerLevels,
state_key="",
sender=self.user_id,
room_id=self.room_id,
content=pls,
)
)

# one more bit of state that doesn't get rolled back
Expand Down Expand Up @@ -268,7 +272,9 @@ def test_update_function_state_row_limit(self):

# have the users join
for u in user_ids:
inject_member_event(self.hs, self.room_id, u, Membership.JOIN)
self.get_success(
inject_member_event(self.hs, self.room_id, u, Membership.JOIN)
)

# Update existing power levels with mod at PL50
pls = self.helper.get_state(
Expand Down Expand Up @@ -306,14 +312,16 @@ def test_update_function_state_row_limit(self):
pl_events = []
for u in user_ids:
pls["users"][u] = 0
e = inject_event(
self.hs,
prev_event_ids=prev_events,
type=EventTypes.PowerLevels,
state_key="",
sender=self.user_id,
room_id=self.room_id,
content=pls,
e = self.get_success(
inject_event(
self.hs,
prev_event_ids=prev_events,
type=EventTypes.PowerLevels,
state_key="",
sender=self.user_id,
room_id=self.room_id,
content=pls,
)
)
prev_events = [e.event_id]
pl_events.append(e)
Expand Down Expand Up @@ -434,13 +442,15 @@ def _inject_test_event(
body = "event %i" % (self.event_count,)
self.event_count += 1

return inject_event(
self.hs,
room_id=self.room_id,
sender=sender,
type="test_event",
content={"body": body},
**kwargs
return self.get_success(
inject_event(
self.hs,
room_id=self.room_id,
sender=sender,
type="test_event",
content={"body": body},
**kwargs
)
)

def _inject_state_event(
Expand All @@ -459,11 +469,13 @@ def _inject_state_event(
if body is None:
body = "state event %s" % (state_key,)

return inject_event(
self.hs,
room_id=self.room_id,
sender=sender,
type="test_state_event",
state_key=state_key,
content={"body": body},
return self.get_success(
inject_event(
self.hs,
room_id=self.room_id,
sender=sender,
type="test_state_event",
state_key=state_key,
content={"body": body},
)
)
56 changes: 32 additions & 24 deletions tests/storage/test_roommember.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,18 +118,22 @@ def test_count_known_servers_stat_counter_enabled(self):

def test_get_joined_users_from_context(self):
room = self.helper.create_room_as(self.u_alice, tok=self.t_alice)
bob_event = event_injection.inject_member_event(
self.hs, room, self.u_bob, Membership.JOIN
bob_event = self.get_success(
event_injection.inject_member_event(
self.hs, room, self.u_bob, Membership.JOIN
)
)

# first, create a regular event
event, context = event_injection.create_event(
self.hs,
room_id=room,
sender=self.u_alice,
prev_event_ids=[bob_event.event_id],
type="m.test.1",
content={},
event, context = self.get_success(
event_injection.create_event(
self.hs,
room_id=room,
sender=self.u_alice,
prev_event_ids=[bob_event.event_id],
type="m.test.1",
content={},
)
)

users = self.get_success(
Expand All @@ -140,22 +144,26 @@ def test_get_joined_users_from_context(self):
# Regression test for #7376: create a state event whose key matches bob's
# user_id, but which is *not* a membership event, and persist that; then check
# that `get_joined_users_from_context` returns the correct users for the next event.
non_member_event = event_injection.inject_event(
self.hs,
room_id=room,
sender=self.u_bob,
prev_event_ids=[bob_event.event_id],
type="m.test.2",
state_key=self.u_bob,
content={},
non_member_event = self.get_success(
event_injection.inject_event(
self.hs,
room_id=room,
sender=self.u_bob,
prev_event_ids=[bob_event.event_id],
type="m.test.2",
state_key=self.u_bob,
content={},
)
)
event, context = event_injection.create_event(
self.hs,
room_id=room,
sender=self.u_alice,
prev_event_ids=[non_member_event.event_id],
type="m.test.3",
content={},
event, context = self.get_success(
event_injection.create_event(
self.hs,
room_id=room,
sender=self.u_alice,
prev_event_ids=[non_member_event.event_id],
type="m.test.3",
content={},
)
)
users = self.get_success(
self.store.get_joined_users_from_context(event, context)
Expand Down
4 changes: 2 additions & 2 deletions tests/storage/test_state.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,8 @@ def inject_state_event(self, room, sender, typ, state_key, content):
},
)

event, context = yield self.event_creation_handler.create_new_client_event(
builder
event, context = yield defer.ensureDeferred(
self.event_creation_handler.create_new_client_event(builder)
)

yield self.storage.persistence.persist_event(event, context)
Expand Down
Loading