Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit be3c7b0

Browse files
authored
Fix deleting device inbox when using background worker (#16311)
Introduced in #16240 The action for the task was only defined on the "master" handler, rather than the base worker one.
1 parent ab13fb0 commit be3c7b0

File tree

2 files changed

+32
-31
lines changed

2 files changed

+32
-31
lines changed

changelog.d/16311.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Delete device messages asynchronously and in staged batches using the task scheduler.

synapse/handlers/device.py

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,14 @@ def __init__(self, hs: "HomeServer"):
9191
self._query_appservices_for_keys = (
9292
hs.config.experimental.msc3984_appservice_key_query
9393
)
94+
self._task_scheduler = hs.get_task_scheduler()
9495

9596
self.device_list_updater = DeviceListWorkerUpdater(hs)
9697

98+
self._task_scheduler.register_action(
99+
self._delete_device_messages, DELETE_DEVICE_MSGS_TASK_NAME
100+
)
101+
97102
@trace
98103
async def get_devices_by_user(self, user_id: str) -> List[JsonDict]:
99104
"""
@@ -383,6 +388,32 @@ async def handle_room_un_partial_stated(self, room_id: str) -> None:
383388
"Trying handling device list state for partial join: not supported on workers."
384389
)
385390

391+
DEVICE_MSGS_DELETE_BATCH_LIMIT = 100
392+
393+
async def _delete_device_messages(
394+
self,
395+
task: ScheduledTask,
396+
) -> Tuple[TaskStatus, Optional[JsonMapping], Optional[str]]:
397+
"""Scheduler task to delete device messages in batch of `DEVICE_MSGS_DELETE_BATCH_LIMIT`."""
398+
assert task.params is not None
399+
user_id = task.params["user_id"]
400+
device_id = task.params["device_id"]
401+
up_to_stream_id = task.params["up_to_stream_id"]
402+
403+
res = await self.store.delete_messages_for_device(
404+
user_id=user_id,
405+
device_id=device_id,
406+
up_to_stream_id=up_to_stream_id,
407+
limit=DeviceHandler.DEVICE_MSGS_DELETE_BATCH_LIMIT,
408+
)
409+
410+
if res < DeviceHandler.DEVICE_MSGS_DELETE_BATCH_LIMIT:
411+
return TaskStatus.COMPLETE, None, None
412+
else:
413+
# There is probably still device messages to be deleted, let's keep the task active and it will be run
414+
# again in a subsequent scheduler loop run (probably the next one, if not too many tasks are running).
415+
return TaskStatus.ACTIVE, None, None
416+
386417

387418
class DeviceHandler(DeviceWorkerHandler):
388419
device_list_updater: "DeviceListUpdater"
@@ -394,7 +425,6 @@ def __init__(self, hs: "HomeServer"):
394425
self._account_data_handler = hs.get_account_data_handler()
395426
self._storage_controllers = hs.get_storage_controllers()
396427
self.db_pool = hs.get_datastores().main.db_pool
397-
self._task_scheduler = hs.get_task_scheduler()
398428

399429
self.device_list_updater = DeviceListUpdater(hs, self)
400430

@@ -428,10 +458,6 @@ def __init__(self, hs: "HomeServer"):
428458
self._delete_stale_devices,
429459
)
430460

431-
self._task_scheduler.register_action(
432-
self._delete_device_messages, DELETE_DEVICE_MSGS_TASK_NAME
433-
)
434-
435461
def _check_device_name_length(self, name: Optional[str]) -> None:
436462
"""
437463
Checks whether a device name is longer than the maximum allowed length.
@@ -590,32 +616,6 @@ async def delete_devices(self, user_id: str, device_ids: List[str]) -> None:
590616

591617
await self.notify_device_update(user_id, device_ids)
592618

593-
DEVICE_MSGS_DELETE_BATCH_LIMIT = 100
594-
595-
async def _delete_device_messages(
596-
self,
597-
task: ScheduledTask,
598-
) -> Tuple[TaskStatus, Optional[JsonMapping], Optional[str]]:
599-
"""Scheduler task to delete device messages in batch of `DEVICE_MSGS_DELETE_BATCH_LIMIT`."""
600-
assert task.params is not None
601-
user_id = task.params["user_id"]
602-
device_id = task.params["device_id"]
603-
up_to_stream_id = task.params["up_to_stream_id"]
604-
605-
res = await self.store.delete_messages_for_device(
606-
user_id=user_id,
607-
device_id=device_id,
608-
up_to_stream_id=up_to_stream_id,
609-
limit=DeviceHandler.DEVICE_MSGS_DELETE_BATCH_LIMIT,
610-
)
611-
612-
if res < DeviceHandler.DEVICE_MSGS_DELETE_BATCH_LIMIT:
613-
return TaskStatus.COMPLETE, None, None
614-
else:
615-
# There is probably still device messages to be deleted, let's keep the task active and it will be run
616-
# again in a subsequent scheduler loop run (probably the next one, if not too many tasks are running).
617-
return TaskStatus.ACTIVE, None, None
618-
619619
async def update_device(self, user_id: str, device_id: str, content: dict) -> None:
620620
"""Update the given device
621621

0 commit comments

Comments
 (0)