Fix room deletion (#12889)

* Fix room deletion

ae7858f broke room deletion by attempting to delete the entry from `rooms`
before the tables that reference it.

* faster_joins: remove database rows on purge
This commit is contained in:
Richard van der Hoff 2022-05-27 11:31:08 +02:00 committed by GitHub
parent bc1beebc27
commit f1605b7447
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 9 deletions

1
changelog.d/12889.bugfix Normal file
View File

@ -0,0 +1 @@
Fix a bug introduced in Synapse 1.59.0 which caused room deletion to fail with a foreign key violation.

View File

@ -322,12 +322,7 @@ class PurgeEventsStore(StateGroupWorkerStore, CacheInvalidationWorkerStore):
) )
def _purge_room_txn(self, txn: LoggingTransaction, room_id: str) -> List[int]: def _purge_room_txn(self, txn: LoggingTransaction, room_id: str) -> List[int]:
# We *immediately* delete the room from the rooms table. This ensures # First, fetch all the state groups that should be deleted, before
# that we don't race when persisting events (as that transaction checks
# that the room exists).
txn.execute("DELETE FROM rooms WHERE room_id = ?", (room_id,))
# Next, we fetch all the state groups that should be deleted, before
# we delete that information. # we delete that information.
txn.execute( txn.execute(
""" """
@ -387,7 +382,7 @@ class PurgeEventsStore(StateGroupWorkerStore, CacheInvalidationWorkerStore):
(room_id,), (room_id,),
) )
# and finally, the tables with an index on room_id (or no useful index) # next, the tables with an index on room_id (or no useful index)
for table in ( for table in (
"current_state_events", "current_state_events",
"destination_rooms", "destination_rooms",
@ -395,8 +390,13 @@ class PurgeEventsStore(StateGroupWorkerStore, CacheInvalidationWorkerStore):
"event_forward_extremities", "event_forward_extremities",
"event_push_actions", "event_push_actions",
"event_search", "event_search",
"partial_state_events",
"events", "events",
"federation_inbound_events_staging",
"group_rooms", "group_rooms",
"local_current_membership",
"partial_state_rooms_servers",
"partial_state_rooms",
"receipts_graph", "receipts_graph",
"receipts_linearized", "receipts_linearized",
"room_aliases", "room_aliases",
@ -416,8 +416,9 @@ class PurgeEventsStore(StateGroupWorkerStore, CacheInvalidationWorkerStore):
"group_summary_rooms", "group_summary_rooms",
"room_account_data", "room_account_data",
"room_tags", "room_tags",
"local_current_membership", # "rooms" happens last, to keep the foreign keys in the other tables
"federation_inbound_events_staging", # happy
"rooms",
): ):
logger.info("[purge] removing %s from %s", room_id, table) logger.info("[purge] removing %s from %s", room_id, table)
txn.execute("DELETE FROM %s WHERE room_id=?" % (table,), (room_id,)) txn.execute("DELETE FROM %s WHERE room_id=?" % (table,), (room_id,))