MDL-80684 core: Fail running tasks on shutdown

When you kill a process which is executing a task, it now marks it as failed.
This commit is contained in:
Frederik Milling Pytlick
2024-02-19 12:06:08 +01:00
parent e4bbd79059
commit 11a3328b06
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
*/
@@ -1078,6 +1089,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.
*
@@ -1127,6 +1174,8 @@ class manager {
$task->get_cron_lock()->release();
}
$task->get_lock()->release();
self::$runningtask = null;
}
/**
@@ -1152,6 +1201,8 @@ class manager {
$record = self::record_from_adhoc_task($task);
$DB->update_record('task_adhoc', $record);
self::task_starting($task);
}
/**
@@ -1177,6 +1228,8 @@ class manager {
$task->get_cron_lock()->release();
}
$task->get_lock()->release();
self::$runningtask = null;
}
/**
@@ -1221,6 +1274,8 @@ class manager {
$task->get_cron_lock()->release();
}
$task->get_lock()->release();
self::$runningtask = null;
}
/**
@@ -1266,6 +1321,8 @@ class manager {
$record->hostname = $hostname;
$record->pid = $pid;
$DB->update_record('task_scheduled', $record);
self::task_starting($task);
}
/**
@@ -1300,6 +1357,8 @@ class manager {
$task->get_cron_lock()->release();
}
$task->get_lock()->release();
self::$runningtask = null;
}
/**