summary refs log tree commit diff
diff options
context:
space:
mode:
authorSean Quah <8349537+squahtx@users.noreply.github.com>2022-06-17 10:22:50 +0100
committerGitHub <noreply@github.com>2022-06-17 10:22:50 +0100
commit9372f6f842e3f8c0166d68a3a49ccc73a76954ea (patch)
tree0fd9be80519f0e258f699510a864a72fb1c0f9f1
parentAdd desc to `get_earliest_token_for_stats` (#13085) (diff)
downloadsynapse-9372f6f842e3f8c0166d68a3a49ccc73a76954ea.tar.xz
Fix logging context misuse when we fail to persist a federation event (#13089)
When we fail to persist a federation event, we kick off a task to remove
its push actions in the background, using the current logging context.
Since we don't `await` that task, we may finish our logging context
before the task finishes. There's no reason to not `await` the task, so
let's do that.

Signed-off-by: Sean Quah <seanq@matrix.org>
-rw-r--r--changelog.d/13089.misc1
-rw-r--r--synapse/handlers/federation_event.py6
2 files changed, 3 insertions, 4 deletions
diff --git a/changelog.d/13089.misc b/changelog.d/13089.misc
new file mode 100644
index 0000000000..5868507cb7
--- /dev/null
+++ b/changelog.d/13089.misc
@@ -0,0 +1 @@
+Fix a long-standing bug where a finished logging context would be re-started when Synapse failed to persist an event from federation.
diff --git a/synapse/handlers/federation_event.py b/synapse/handlers/federation_event.py
index 565ffd7cfd..b7c54e642f 100644
--- a/synapse/handlers/federation_event.py
+++ b/synapse/handlers/federation_event.py
@@ -57,7 +57,7 @@ from synapse.event_auth import (
 from synapse.events import EventBase
 from synapse.events.snapshot import EventContext
 from synapse.federation.federation_client import InvalidResponseError
-from synapse.logging.context import nested_logging_context, run_in_background
+from synapse.logging.context import nested_logging_context
 from synapse.metrics.background_process_metrics import run_as_background_process
 from synapse.replication.http.devices import ReplicationUserDevicesResyncRestServlet
 from synapse.replication.http.federation import (
@@ -1964,9 +1964,7 @@ class FederationEventHandler:
                 event.room_id, [(event, context)], backfilled=backfilled
             )
         except Exception:
-            run_in_background(
-                self._store.remove_push_actions_from_staging, event.event_id
-            )
+            await self._store.remove_push_actions_from_staging(event.event_id)
             raise
 
     async def persist_events_and_notify(