forked from MirrorHub/synapse
Fix order of partial state tables when purging (#15068)
* Fix order of partial state tables when purging `partial_state_rooms` has an FK on `events` pointing to the join event we get from `/send_join`, so we must delete from that table before deleting from `events`. **NB:** It would be nice to cancel any resync processes for the room being purged. We do not do this at present. To do so reliably we'd need an internal HTTP "replication" endpoint, because the worker doing the resync process may be different to that handling the purge request. The first time the resync process tries to write data after the deletion it will fail because we have deleted necessary data e.g. auth events. AFAICS it will not retry the resync, so the only downside to not cancelling the resync is a scary-looking traceback. (This is presumably extremely race-sensitive.) * Changelog * admist(?) -> between * Warn about a race * Fix typo, thanks Sean Co-authored-by: Sean Quah <8349537+squahtx@users.noreply.github.com> --------- Co-authored-by: Sean Quah <8349537+squahtx@users.noreply.github.com>
This commit is contained in:
parent
42aea0d8af
commit
06ba71083e
3 changed files with 10 additions and 2 deletions
1
changelog.d/15068.bugfix
Normal file
1
changelog.d/15068.bugfix
Normal file
|
@ -0,0 +1 @@
|
|||
Fix a bug introduced in Synapse 1.76.0 where partially-joined rooms could not be deleted using the [purge room API](https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#delete-room-api).
|
|
@ -1880,6 +1880,11 @@ class FederationHandler:
|
|||
logger.info("Updating current state for %s", room_id)
|
||||
# TODO(faster_joins): notify workers in notify_room_un_partial_stated
|
||||
# https://github.com/matrix-org/synapse/issues/12994
|
||||
#
|
||||
# NB: there's a potential race here. If room is purged just before we
|
||||
# call this, we _might_ end up inserting rows into current_state_events.
|
||||
# (The logic is hard to chase through.) We think this is fine, but if
|
||||
# not the HS admin should purge the room again.
|
||||
await self.state_handler.update_current_state(room_id)
|
||||
|
||||
logger.info("Handling any pending device list updates")
|
||||
|
|
|
@ -420,12 +420,14 @@ class PurgeEventsStore(StateGroupWorkerStore, CacheInvalidationWorkerStore):
|
|||
"event_push_actions",
|
||||
"event_search",
|
||||
"event_failed_pull_attempts",
|
||||
# Note: the partial state tables have foreign keys between each other, and to
|
||||
# `events` and `rooms`. We need to delete from them in the right order.
|
||||
"partial_state_events",
|
||||
"partial_state_rooms_servers",
|
||||
"partial_state_rooms",
|
||||
"events",
|
||||
"federation_inbound_events_staging",
|
||||
"local_current_membership",
|
||||
"partial_state_rooms_servers",
|
||||
"partial_state_rooms",
|
||||
"receipts_graph",
|
||||
"receipts_linearized",
|
||||
"room_aliases",
|
||||
|
|
Loading…
Reference in a new issue