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>
This commit is contained in:
Sean Quah 2022-06-17 10:22:50 +01:00 committed by GitHub
parent 8ceed5e6b5
commit 9372f6f842
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 3 additions and 4 deletions

1
changelog.d/13089.misc Normal file
View File

@ -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.

View File

@ -57,7 +57,7 @@ from synapse.event_auth import (
from synapse.events import EventBase from synapse.events import EventBase
from synapse.events.snapshot import EventContext from synapse.events.snapshot import EventContext
from synapse.federation.federation_client import InvalidResponseError 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.metrics.background_process_metrics import run_as_background_process
from synapse.replication.http.devices import ReplicationUserDevicesResyncRestServlet from synapse.replication.http.devices import ReplicationUserDevicesResyncRestServlet
from synapse.replication.http.federation import ( from synapse.replication.http.federation import (
@ -1964,9 +1964,7 @@ class FederationEventHandler:
event.room_id, [(event, context)], backfilled=backfilled event.room_id, [(event, context)], backfilled=backfilled
) )
except Exception: except Exception:
run_in_background( await self._store.remove_push_actions_from_staging(event.event_id)
self._store.remove_push_actions_from_staging, event.event_id
)
raise raise
async def persist_events_and_notify( async def persist_events_and_notify(