Skip to content

Commit 8d5d87f

Browse files
Fix run_as_background_process not be awaited properly causing LoggingContext problems (#18938)
Basically, searching for any instance of `run_as_background_process(...)` and making sure we wrap the deferred in `make_deferred_yieldable(...)` if we try to `await` the result to make it follow the [Synapse logcontext rules](https://github.com/element-hq/synapse/blob/develop/docs/log_contexts.md). Part of #18905
1 parent 9a88d25 commit 8d5d87f

File tree

2 files changed

+8
-4
lines changed

2 files changed

+8
-4
lines changed

changelog.d/18938.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix `run_as_background_process` not be awaited properly causing `LoggingContext` problems in experimental [MSC4140](https://github.com/matrix-org/matrix-spec-proposals/pull/4140): Delayed events implementation.

synapse/handlers/delayed_events.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,12 @@
2121
from synapse.api.errors import ShadowBanError
2222
from synapse.api.ratelimiting import Ratelimiter
2323
from synapse.config.workers import MAIN_PROCESS_INSTANCE_NAME
24+
from synapse.logging.context import make_deferred_yieldable
2425
from synapse.logging.opentracing import set_tag
2526
from synapse.metrics import SERVER_NAME_LABEL, event_processing_positions
26-
from synapse.metrics.background_process_metrics import run_as_background_process
27+
from synapse.metrics.background_process_metrics import (
28+
run_as_background_process,
29+
)
2730
from synapse.replication.http.delayed_events import (
2831
ReplicationAddedDelayedEventRestServlet,
2932
)
@@ -328,7 +331,7 @@ async def cancel(self, requester: Requester, delay_id: str) -> None:
328331
requester,
329332
(requester.user.to_string(), requester.device_id),
330333
)
331-
await self._initialized_from_db
334+
await make_deferred_yieldable(self._initialized_from_db)
332335

333336
next_send_ts = await self._store.cancel_delayed_event(
334337
delay_id=delay_id,
@@ -354,7 +357,7 @@ async def restart(self, requester: Requester, delay_id: str) -> None:
354357
requester,
355358
(requester.user.to_string(), requester.device_id),
356359
)
357-
await self._initialized_from_db
360+
await make_deferred_yieldable(self._initialized_from_db)
358361

359362
next_send_ts = await self._store.restart_delayed_event(
360363
delay_id=delay_id,
@@ -380,7 +383,7 @@ async def send(self, requester: Requester, delay_id: str) -> None:
380383
# Use standard request limiter for sending delayed events on-demand,
381384
# as an on-demand send is similar to sending a regular event.
382385
await self._request_ratelimiter.ratelimit(requester)
383-
await self._initialized_from_db
386+
await make_deferred_yieldable(self._initialized_from_db)
384387

385388
event, next_send_ts = await self._store.process_target_delayed_event(
386389
delay_id=delay_id,

0 commit comments

Comments
 (0)