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:
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user