From 83dbc72f387de1d12e2609ddba1aecb2ba8f3660 Mon Sep 17 00:00:00 2001 From: Brendan Heywood Date: Tue, 21 Feb 2017 12:44:59 +1100 Subject: [PATCH] MDL-50719 cron: Fixed parallel task lock contention issues --- lib/classes/task/manager.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/classes/task/manager.php b/lib/classes/task/manager.php index 95cbcfcdf56..60a5240baac 100644 --- a/lib/classes/task/manager.php +++ b/lib/classes/task/manager.php @@ -421,8 +421,16 @@ class manager { foreach ($records as $record) { - if ($lock = $cronlockfactory->get_lock('adhoc_' . $record->id, 10)) { + if ($lock = $cronlockfactory->get_lock('adhoc_' . $record->id, 0)) { $classname = '\\' . $record->classname; + + // Safety check, see if the task has been already processed by another cron run. + $record = $DB->get_record('task_adhoc', array('id' => $record->id)); + if (!$record) { + $lock->release(); + continue; + } + $task = self::adhoc_task_from_record($record); // Safety check in case the task in the DB does not match a real class (maybe something was uninstalled). if (!$task) { @@ -472,7 +480,7 @@ class manager { foreach ($records as $record) { - if ($lock = $cronlockfactory->get_lock(($record->classname), 10)) { + if ($lock = $cronlockfactory->get_lock(($record->classname), 0)) { $classname = '\\' . $record->classname; $task = self::scheduled_task_from_record($record); // Safety check in case the task in the DB does not match a real class (maybe something was uninstalled).