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:
parent
bc1beebc27
commit
f1605b7447
|
@ -0,0 +1 @@
|
||||||
|
Fix a bug introduced in Synapse 1.59.0 which caused room deletion to fail with a foreign key violation.
|
|
@ -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,))
|
||||||
|
|
Loading…
Reference in New Issue