Merge branch 'MDL-80684-MOODLE_402_STABLE-fail_running_tasks_on_shutdown' of https://github.com/praxisdigital/moodle into MOODLE_402_STABLE

This commit is contained in:
Andrew Nicols
2024-02-28 14:21:13 +08:00
3 changed files with 122 additions and 0 deletions
+59
View File
@@ -26,6 +26,7 @@ namespace core\task;
use core\lock\lock;
use core\lock\lock_factory;
use core_shutdown_manager;
define('CORE_TASK_TASKS_FILENAME', 'db/tasks.php');
/**
@@ -49,6 +50,16 @@ class manager {
*/
const ADHOC_TASK_QUEUE_MODE_FILLING = 1;
/**
* @var ?task_base $runningtask Used to tell what is the current running task in this process.
*/
public static ?task_base $runningtask = null;
/**
* @var bool Used to tell if the manager's shutdown callback has been registered.
*/
public static bool $registeredshutdownhandler = false;
/**
* @var array A cached queue of adhoc tasks
*/
@@ -1087,6 +1098,42 @@ class manager {
return null;
}
/**
* This function will fail the currently running task, if there is one.
*/
public static function fail_running_task(): void {
$runningtask = self::$runningtask;
if ($runningtask === null) {
return;
}
if ($runningtask instanceof scheduled_task) {
self::scheduled_task_failed($runningtask);
return;
}
if ($runningtask instanceof adhoc_task) {
self::adhoc_task_failed($runningtask);
return;
}
}
/**
* This function set's the $runningtask variable and ensures that the shutdown handler is registered.
* @param task_base $task
*/
private static function task_starting(task_base $task): void {
self::$runningtask = $task;
// Add \core\task\manager::fail_running_task to shutdown manager, so we can ensure running tasks fail on shutdown.
if (!self::$registeredshutdownhandler) {
core_shutdown_manager::register_function('\core\task\manager::fail_running_task');
self::$registeredshutdownhandler = true;
}
}
/**
* This function indicates that an adhoc task was not completed successfully and should be retried.
*
@@ -1136,6 +1183,8 @@ class manager {
$task->get_cron_lock()->release();
}
$task->get_lock()->release();
self::$runningtask = null;
}
/**
@@ -1161,6 +1210,8 @@ class manager {
$record = self::record_from_adhoc_task($task);
$DB->update_record('task_adhoc', $record);
self::task_starting($task);
}
/**
@@ -1186,6 +1237,8 @@ class manager {
$task->get_cron_lock()->release();
}
$task->get_lock()->release();
self::$runningtask = null;
}
/**
@@ -1230,6 +1283,8 @@ class manager {
$task->get_cron_lock()->release();
}
$task->get_lock()->release();
self::$runningtask = null;
}
/**
@@ -1275,6 +1330,8 @@ class manager {
$record->hostname = $hostname;
$record->pid = $pid;
$DB->update_record('task_scheduled', $record);
self::task_starting($task);
}
/**
@@ -1309,6 +1366,8 @@ class manager {
$task->get_cron_lock()->release();
}
$task->get_lock()->release();
self::$runningtask = null;
}
/**