Skip to content

Commit affaffb

Browse files
authored
Run cache_joined_hosts_for_event in background (matrix-org#9951)
1 parent 63fb220 commit affaffb

File tree

2 files changed

+41
-5
lines changed

2 files changed

+41
-5
lines changed

changelog.d/9951.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Improve performance of sending events for worker-based deployments using Redis.

synapse/handlers/message.py

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
from canonicaljson import encode_canonical_json
2121

22+
from twisted.internet import defer
2223
from twisted.internet.interfaces import IDelayedCall
2324

2425
from synapse import event_auth
@@ -43,14 +44,14 @@
4344
from synapse.events.builder import EventBuilder
4445
from synapse.events.snapshot import EventContext
4546
from synapse.events.validator import EventValidator
46-
from synapse.logging.context import run_in_background
47+
from synapse.logging.context import make_deferred_yieldable, run_in_background
4748
from synapse.metrics.background_process_metrics import run_as_background_process
4849
from synapse.replication.http.send_event import ReplicationSendEventRestServlet
4950
from synapse.storage.databases.main.events_worker import EventRedactBehaviour
5051
from synapse.storage.state import StateFilter
5152
from synapse.types import Requester, RoomAlias, StreamToken, UserID, create_requester
52-
from synapse.util import json_decoder, json_encoder
53-
from synapse.util.async_helpers import Linearizer
53+
from synapse.util import json_decoder, json_encoder, log_failure
54+
from synapse.util.async_helpers import Linearizer, unwrapFirstError
5455
from synapse.util.caches.expiringcache import ExpiringCache
5556
from synapse.util.metrics import measure_func
5657
from synapse.visibility import filter_events_for_client
@@ -979,9 +980,43 @@ async def handle_new_client_event(
979980
logger.exception("Failed to encode content: %r", event.content)
980981
raise
981982

982-
await self.action_generator.handle_push_actions_for_event(event, context)
983+
# We now persist the event (and update the cache in parallel, since we
984+
# don't want to block on it).
985+
result = await make_deferred_yieldable(
986+
defer.gatherResults(
987+
[
988+
run_in_background(
989+
self._persist_event,
990+
requester=requester,
991+
event=event,
992+
context=context,
993+
ratelimit=ratelimit,
994+
extra_users=extra_users,
995+
),
996+
run_in_background(
997+
self.cache_joined_hosts_for_event, event, context
998+
).addErrback(log_failure, "cache_joined_hosts_for_event failed"),
999+
],
1000+
consumeErrors=True,
1001+
)
1002+
).addErrback(unwrapFirstError)
1003+
1004+
return result[0]
1005+
1006+
async def _persist_event(
1007+
self,
1008+
requester: Requester,
1009+
event: EventBase,
1010+
context: EventContext,
1011+
ratelimit: bool = True,
1012+
extra_users: Optional[List[UserID]] = None,
1013+
) -> EventBase:
1014+
"""Actually persists the event. Should only be called by
1015+
`handle_new_client_event`, and see its docstring for documentation of
1016+
the arguments.
1017+
"""
9831018

984-
await self.cache_joined_hosts_for_event(event, context)
1019+
await self.action_generator.handle_push_actions_for_event(event, context)
9851020

9861021
try:
9871022
# If we're a worker we need to hit out to the master.

0 commit comments

Comments
 (0)