Allow immediate processing of just prepared tasks in cron worker runner

Preparing simple worker tasks is super fast, because it just switches the state to null.
But the processing of just prepared tasks required the second worker run and also second cron run.
This change optimize the behavior and in case there is still time left it immediately starts processing the tasks.
[MAILPOET-4684]
This commit is contained in:
Rostislav Wolny
2022-09-29 14:36:07 +02:00
committed by Aschepikov
parent 05b441378d
commit 69ac29d0a7
3 changed files with 9 additions and 17 deletions

View File

@@ -73,6 +73,8 @@ class CronWorkerRunner {
foreach ($dueTasks as $task) {
$this->prepareTask($worker, $task);
}
// Re-fetch running tasks so that we can process tasks that were just prepared
$runningTasks = $this->getRunningTasks($worker);
foreach ($runningTasks as $task) {
$this->processTask($worker, $task);
}

View File

@@ -47,10 +47,10 @@ class CronWorkerRunnerTest extends \MailPoetTest {
$this->cronWorkerRunner->run($worker);
}
public function testItPreparesTask() {
public function testItPreparesTaskAndProcessesItImmediately() {
$worker = $this->make(SimpleWorkerMockImplementation::class, [
'prepareTaskStrategy' => Expected::once(true),
'processTaskStrategy' => Expected::never(),
'processTaskStrategy' => Expected::once(true),
]);
$task = $this->createScheduledTask();
@@ -58,7 +58,7 @@ class CronWorkerRunnerTest extends \MailPoetTest {
expect($result)->true();
$scheduledTask = $this->scheduledTasksRepository->findOneById($task->getId());
assert($scheduledTask instanceof ScheduledTaskEntity);
expect($scheduledTask->getStatus())->null();
expect($scheduledTask->getStatus())->same(ScheduledTaskEntity::STATUS_COMPLETED);
}
public function testItProcessesTask() {

View File

@@ -83,15 +83,7 @@ class WooCommerceOrdersTest extends \MailPoetTest {
assert($task instanceof ScheduledTaskEntity);
expect($task->getStatus())->equals(ScheduledTaskEntity::STATUS_SCHEDULED);
// 2. prepare
expect($this->worker->checkProcessingRequirements())->true();
$this->cronWorkerRunner->run($this->worker);
$this->entityManager->clear();
$task = $this->scheduledTaskRepository->findOneBy(['type' => WooCommercePastOrders::TASK_TYPE]);
assert($task instanceof ScheduledTaskEntity);
expect($task->getStatus())->null(); // null means 'running'
// 3. run
// 2. prepare and run
expect($this->worker->checkProcessingRequirements())->true();
$this->cronWorkerRunner->run($this->worker);
$this->entityManager->clear();
@@ -99,7 +91,7 @@ class WooCommerceOrdersTest extends \MailPoetTest {
assert($task instanceof ScheduledTaskEntity);
expect($task->getStatus())->equals(ScheduledTaskEntity::STATUS_COMPLETED);
// 4. complete (do not schedule again)
// 3. complete (do not schedule again)
expect($this->worker->checkProcessingRequirements())->false();
$this->cronWorkerRunner->run($this->worker);
$this->entityManager->clear();
@@ -120,8 +112,7 @@ class WooCommerceOrdersTest extends \MailPoetTest {
$this->woocommercePurchases->expects($this->exactly(3))->method('trackPurchase');
$this->cronWorkerRunner->run($this->worker); // schedule
$this->cronWorkerRunner->run($this->worker); // prepare
$this->cronWorkerRunner->run($this->worker); // run
$this->cronWorkerRunner->run($this->worker); // prepare and run
$this->entityManager->clear();
$tasks = $this->scheduledTaskRepository->findBy(['type' => WooCommercePastOrders::TASK_TYPE]);
@@ -137,8 +128,7 @@ class WooCommerceOrdersTest extends \MailPoetTest {
$this->woocommercePurchases->expects($this->exactly(5))->method('trackPurchase');
$this->cronWorkerRunner->run($this->worker); // schedule
$this->cronWorkerRunner->run($this->worker); // prepare
$this->cronWorkerRunner->run($this->worker); // run for 1, 2, 3
$this->cronWorkerRunner->run($this->worker); // prepare and run for 1, 2, 3
$task = $this->scheduledTaskRepository->findOneBy(['type' => WooCommercePastOrders::TASK_TYPE]);
assert($task instanceof ScheduledTaskEntity);