From c44b4213e6310d3f6f33b4776f3d4cb4f15d6fae Mon Sep 17 00:00:00 2001 From: Ankit Agarwal Date: Mon, 1 Jun 2015 12:39:53 +0530 Subject: [PATCH] MDL-47480 tasks: Define order for getting tasks --- lib/classes/task/manager.php | 3 ++- lib/tests/scheduled_task_test.php | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/classes/task/manager.php b/lib/classes/task/manager.php index 36772eebaa6..15e45120c51 100644 --- a/lib/classes/task/manager.php +++ b/lib/classes/task/manager.php @@ -448,7 +448,8 @@ class manager { $where = "(lastruntime IS NULL OR lastruntime < :timestart1) AND (nextruntime IS NULL OR nextruntime < :timestart2) - AND disabled = 0"; + AND disabled = 0 + ORDER BY lastruntime, id ASC"; $params = array('timestart1' => $timestart, 'timestart2' => $timestart); $records = $DB->get_records_select('task_scheduled', $where, $params); diff --git a/lib/tests/scheduled_task_test.php b/lib/tests/scheduled_task_test.php index d07b60771ac..ebe284c43c7 100644 --- a/lib/tests/scheduled_task_test.php +++ b/lib/tests/scheduled_task_test.php @@ -273,6 +273,33 @@ class core_scheduled_task_testcase extends advanced_testcase { // Should not get any task. $task = \core\task\manager::get_next_scheduled_task($now); $this->assertNull($task); + + // Check ordering. + $DB->delete_records('task_scheduled'); + $record->lastruntime = 2; + $record->disabled = 0; + $record->classname = '\core\task\scheduled_test_task'; + $DB->insert_record('task_scheduled', $record); + + $record->lastruntime = 1; + $record->classname = '\core\task\scheduled_test2_task'; + $DB->insert_record('task_scheduled', $record); + + // Should get handed the second task. + $task = \core\task\manager::get_next_scheduled_task($now); + $this->assertInstanceOf('\core\task\scheduled_test2_task', $task); + $task->execute(); + \core\task\manager::scheduled_task_complete($task); + + // Should get handed the first task. + $task = \core\task\manager::get_next_scheduled_task($now); + $this->assertInstanceOf('\core\task\scheduled_test_task', $task); + $task->execute(); + \core\task\manager::scheduled_task_complete($task); + + // Should not get any task. + $task = \core\task\manager::get_next_scheduled_task($now); + $this->assertNull($task); } public function test_get_broken_scheduled_task() {