Delete max 10000 rows from scheduled task subscribers in cleanup.

DB may crash when deleting too many rows in one query.
The scheduled_task_subscribers has the potential to contain many records.
This commit adds limit when cleaning up inconsistent data from scheduled task subscribers.
[MAILPOET-6155]
This commit is contained in:
Rostislav Wolny
2024-08-02 14:41:17 +02:00
committed by Aschepikov
parent 4733bde082
commit 5a7462a152
2 changed files with 46 additions and 9 deletions

View File

@@ -67,19 +67,29 @@ class DataInconsistencyRepositoryTest extends \MailPoetTest {
}
public function testItHandlesOrphanedScheduledTaskSubscribers(): void {
$taskWithSubscriber = (new ScheduledTask())->create(SendingQueueWorker::TASK_TYPE, ScheduledTaskEntity::STATUS_SCHEDULED);
$taskToDelete = (new ScheduledTask())->create(SendingQueueWorker::TASK_TYPE, ScheduledTaskEntity::STATUS_SCHEDULED);
$taskToKeep = (new ScheduledTask())->create(SendingQueueWorker::TASK_TYPE, ScheduledTaskEntity::STATUS_SCHEDULED);
$subscriber1 = (new Subscriber())->create();
(new ScheduledTaskSubscriber())->createProcessed($taskWithSubscriber, $subscriber1);
(new ScheduledTaskSubscriber())->createProcessed($taskToDelete, $subscriber1);
(new ScheduledTaskSubscriber())->createProcessed($taskToKeep, $subscriber1);
$subscriber2 = (new Subscriber())->create();
(new ScheduledTaskSubscriber())->createProcessed($taskWithSubscriber, $subscriber2);
(new ScheduledTaskSubscriber())->createProcessed($taskToDelete, $subscriber2);
(new ScheduledTaskSubscriber())->createProcessed($taskToKeep, $subscriber2);
$this->entityManager->remove($taskWithSubscriber);
$this->entityManager->remove($taskToDelete);
$this->entityManager->flush();
$taskSubscriberCount = $this->entityManager->getRepository(ScheduledTaskSubscriberEntity::class)->count([]);
verify($taskSubscriberCount)->equals(4);
verify($this->repository->getOrphanedScheduledTasksSubscribersCount())->equals(2);
$this->repository->cleanupOrphanedScheduledTaskSubscribers();
verify($this->repository->getOrphanedScheduledTasksSubscribersCount())->equals(0);
// We keep the task and subscriber that was associated with the task we kept
$taskSubscriberCount = $this->entityManager->getRepository(ScheduledTaskSubscriberEntity::class)->count([]);
verify($taskSubscriberCount)->equals(2);
}
public function testItHandlesSendingQueuesWithoutNewsletter(): void {