|
@@ -24,6 +24,7 @@ from synapse.api.errors import SynapseError
|
|
|
from synapse.api.filtering import Filter
|
|
|
from synapse.events.utils import SerializeEventConfig
|
|
|
from synapse.handlers.room import ShutdownRoomResponse
|
|
|
+from synapse.handlers.worker_lock import NEW_EVENT_DURING_PURGE_LOCK_NAME
|
|
|
from synapse.logging.opentracing import trace
|
|
|
from synapse.metrics.background_process_metrics import run_as_background_process
|
|
|
from synapse.rest.admin._base import assert_user_is_admin
|
|
@@ -46,9 +47,10 @@ logger = logging.getLogger(__name__)
|
|
|
BACKFILL_BECAUSE_TOO_MANY_GAPS_THRESHOLD = 3
|
|
|
|
|
|
|
|
|
-PURGE_HISTORY_LOCK_NAME = "purge_history_lock"
|
|
|
-
|
|
|
-DELETE_ROOM_LOCK_NAME = "delete_room_lock"
|
|
|
+# This is used to avoid purging a room several time at the same moment,
|
|
|
+# and also paginating during a purge. Pagination can trigger backfill,
|
|
|
+# which would create old events locally, and would potentially clash with the room delete.
|
|
|
+PURGE_PAGINATION_LOCK_NAME = "purge_pagination_lock"
|
|
|
|
|
|
|
|
|
@attr.s(slots=True, auto_attribs=True)
|
|
@@ -363,7 +365,7 @@ class PaginationHandler:
|
|
|
self._purges_in_progress_by_room.add(room_id)
|
|
|
try:
|
|
|
async with self._worker_locks.acquire_read_write_lock(
|
|
|
- PURGE_HISTORY_LOCK_NAME, room_id, write=True
|
|
|
+ PURGE_PAGINATION_LOCK_NAME, room_id, write=True
|
|
|
):
|
|
|
await self._storage_controllers.purge_events.purge_history(
|
|
|
room_id, token, delete_local_events
|
|
@@ -421,7 +423,10 @@ class PaginationHandler:
|
|
|
force: set true to skip checking for joined users.
|
|
|
"""
|
|
|
async with self._worker_locks.acquire_multi_read_write_lock(
|
|
|
- [(PURGE_HISTORY_LOCK_NAME, room_id), (DELETE_ROOM_LOCK_NAME, room_id)],
|
|
|
+ [
|
|
|
+ (PURGE_PAGINATION_LOCK_NAME, room_id),
|
|
|
+ (NEW_EVENT_DURING_PURGE_LOCK_NAME, room_id),
|
|
|
+ ],
|
|
|
write=True,
|
|
|
):
|
|
|
# first check that we have no users in this room
|
|
@@ -483,7 +488,7 @@ class PaginationHandler:
|
|
|
room_token = from_token.room_key
|
|
|
|
|
|
async with self._worker_locks.acquire_read_write_lock(
|
|
|
- PURGE_HISTORY_LOCK_NAME, room_id, write=False
|
|
|
+ PURGE_PAGINATION_LOCK_NAME, room_id, write=False
|
|
|
):
|
|
|
(membership, member_event_id) = (None, None)
|
|
|
if not use_admin_priviledge:
|
|
@@ -761,7 +766,7 @@ class PaginationHandler:
|
|
|
self._purges_in_progress_by_room.add(room_id)
|
|
|
try:
|
|
|
async with self._worker_locks.acquire_read_write_lock(
|
|
|
- PURGE_HISTORY_LOCK_NAME, room_id, write=True
|
|
|
+ PURGE_PAGINATION_LOCK_NAME, room_id, write=True
|
|
|
):
|
|
|
self._delete_by_id[delete_id].status = DeleteStatus.STATUS_SHUTTING_DOWN
|
|
|
self._delete_by_id[
|