From e63040d02b858cc151e475cae1ffd214be85c812 Mon Sep 17 00:00:00 2001 From: Mikhail Golenkov Date: Mon, 17 Feb 2020 14:54:08 +1100 Subject: [PATCH] MDL-67980 tasks: Sort ad-hoc tasks by nextruntime. --- lib/classes/task/manager.php | 2 +- lib/tests/adhoc_task_test.php | 46 +++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/lib/classes/task/manager.php b/lib/classes/task/manager.php index e0ab0e4ea71..c7f5033d476 100644 --- a/lib/classes/task/manager.php +++ b/lib/classes/task/manager.php @@ -561,7 +561,7 @@ class manager { $where = '(nextruntime IS NULL OR nextruntime < :timestart1)'; $params = array('timestart1' => $timestart); - $records = $DB->get_records_select('task_adhoc', $where, $params); + $records = $DB->get_records_select('task_adhoc', $where, $params, 'nextruntime ASC, id ASC'); $records = self::ensure_adhoc_task_qos($records); diff --git a/lib/tests/adhoc_task_test.php b/lib/tests/adhoc_task_test.php index f90f238bd55..b0fdbb52f67 100644 --- a/lib/tests/adhoc_task_test.php +++ b/lib/tests/adhoc_task_test.php @@ -396,4 +396,50 @@ class core_adhoc_task_testcase extends advanced_testcase { $concurrencylimit = $task->get_concurrency_limit(); $this->assertEquals(5, $concurrencylimit); } + + /** + * Test adhoc task sorting. + */ + public function test_get_next_adhoc_task_sorting() { + $this->resetAfterTest(true); + + // Create adhoc tasks. + $task1 = new \core\task\adhoc_test_task(); + $task1->set_next_run_time(1510000000); + $task1->set_custom_data_as_string('Task 1'); + \core\task\manager::queue_adhoc_task($task1); + + $task2 = new \core\task\adhoc_test_task(); + $task2->set_next_run_time(1520000000); + $task2->set_custom_data_as_string('Task 2'); + \core\task\manager::queue_adhoc_task($task2); + + $task3 = new \core\task\adhoc_test_task(); + $task3->set_next_run_time(1520000000); + $task3->set_custom_data_as_string('Task 3'); + \core\task\manager::queue_adhoc_task($task3); + + // Shuffle tasks. + $task1->set_next_run_time(1540000000); + \core\task\manager::reschedule_or_queue_adhoc_task($task1); + + $task3->set_next_run_time(1530000000); + \core\task\manager::reschedule_or_queue_adhoc_task($task3); + + $task2->set_next_run_time(1530000000); + \core\task\manager::reschedule_or_queue_adhoc_task($task2); + + // Confirm, that tasks are sorted by nextruntime and then by id (ascending). + $task = \core\task\manager::get_next_adhoc_task(time()); + $this->assertEquals('Task 2', $task->get_custom_data_as_string()); + \core\task\manager::adhoc_task_complete($task); + + $task = \core\task\manager::get_next_adhoc_task(time()); + $this->assertEquals('Task 3', $task->get_custom_data_as_string()); + \core\task\manager::adhoc_task_complete($task); + + $task = \core\task\manager::get_next_adhoc_task(time()); + $this->assertEquals('Task 1', $task->get_custom_data_as_string()); + \core\task\manager::adhoc_task_complete($task); + } }