mirror of
https://github.com/moodle/moodle.git
synced 2025-08-04 00:16:46 +02:00
Merge branch 'MDL-80749-main' of https://github.com/HuongNV13/moodle
This commit is contained in:
commit
30bfb5fe81
5 changed files with 96 additions and 5 deletions
|
@ -1227,6 +1227,13 @@ class manager {
|
||||||
$task->set_pid($pid);
|
$task->set_pid($pid);
|
||||||
|
|
||||||
$record = self::record_from_adhoc_task($task);
|
$record = self::record_from_adhoc_task($task);
|
||||||
|
|
||||||
|
// If this is the first time the task has been started, then set the first starting time.
|
||||||
|
$firststartingtime = $DB->get_field('task_adhoc', 'firststartingtime', ['id' => $record->id]);
|
||||||
|
if (is_null($firststartingtime)) {
|
||||||
|
$record->firststartingtime = $time;
|
||||||
|
}
|
||||||
|
|
||||||
$DB->update_record('task_adhoc', $record);
|
$DB->update_record('task_adhoc', $record);
|
||||||
|
|
||||||
self::task_starting($task);
|
self::task_starting($task);
|
||||||
|
@ -1813,7 +1820,7 @@ class manager {
|
||||||
$CFG->task_adhoc_failed_retention : static::ADHOC_TASK_FAILED_RETENTION;
|
$CFG->task_adhoc_failed_retention : static::ADHOC_TASK_FAILED_RETENTION;
|
||||||
$DB->delete_records_select(
|
$DB->delete_records_select(
|
||||||
table: 'task_adhoc',
|
table: 'task_adhoc',
|
||||||
select: 'attemptsavailable = 0 AND timestarted < :time',
|
select: 'attemptsavailable = 0 AND firststartingtime < :time',
|
||||||
params: ['time' => time() - $difftime],
|
params: ['time' => time() - $difftime],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<XMLDB PATH="lib/db" VERSION="20240123" COMMENT="XMLDB file for core Moodle tables"
|
<XMLDB PATH="lib/db" VERSION="20240129" COMMENT="XMLDB file for core Moodle tables"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:noNamespaceSchemaLocation="../../lib/xmldb/xmldb.xsd"
|
xsi:noNamespaceSchemaLocation="../../lib/xmldb/xmldb.xsd"
|
||||||
>
|
>
|
||||||
|
@ -3510,6 +3510,7 @@
|
||||||
<FIELD NAME="hostname" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false" COMMENT="Hostname where the task is running"/>
|
<FIELD NAME="hostname" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false" COMMENT="Hostname where the task is running"/>
|
||||||
<FIELD NAME="pid" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false" COMMENT="PHP process ID that is running the task"/>
|
<FIELD NAME="pid" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false" COMMENT="PHP process ID that is running the task"/>
|
||||||
<FIELD NAME="attemptsavailable" TYPE="int" LENGTH="1" NOTNULL="false" SEQUENCE="false" COMMENT="The remaining attempts for this task"/>
|
<FIELD NAME="attemptsavailable" TYPE="int" LENGTH="1" NOTNULL="false" SEQUENCE="false" COMMENT="The remaining attempts for this task"/>
|
||||||
|
<FIELD NAME="firststartingtime" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false" COMMENT="The start time of the first run of the task"/>
|
||||||
</FIELDS>
|
</FIELDS>
|
||||||
<KEYS>
|
<KEYS>
|
||||||
<KEY NAME="primary" TYPE="primary" FIELDS="id"/>
|
<KEY NAME="primary" TYPE="primary" FIELDS="id"/>
|
||||||
|
|
|
@ -1093,5 +1093,20 @@ function xmldb_main_upgrade($oldversion) {
|
||||||
upgrade_main_savepoint(true, 2024022300.02);
|
upgrade_main_savepoint(true, 2024022300.02);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($oldversion < 2024030500.01) {
|
||||||
|
|
||||||
|
// Define field firststartingtime to be added to task_adhoc.
|
||||||
|
$table = new xmldb_table('task_adhoc');
|
||||||
|
$field = new xmldb_field('firststartingtime', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'attemptsavailable');
|
||||||
|
|
||||||
|
// Conditionally launch add field firststartingtime.
|
||||||
|
if (!$dbman->field_exists($table, $field)) {
|
||||||
|
$dbman->add_field($table, $field);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Main savepoint reached.
|
||||||
|
upgrade_main_savepoint(true, 2024030500.01);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -305,7 +305,7 @@ class adhoc_task_test extends \advanced_testcase {
|
||||||
// Update the time of the task2 to be older more than 2 days.
|
// Update the time of the task2 to be older more than 2 days.
|
||||||
$DB->set_field(
|
$DB->set_field(
|
||||||
table: 'task_adhoc',
|
table: 'task_adhoc',
|
||||||
newfield: 'timestarted',
|
newfield: 'firststartingtime',
|
||||||
newvalue: time() - (DAYSECS * 2) - 10, // Plus 10 seconds to make sure it is older than 2 days.
|
newvalue: time() - (DAYSECS * 2) - 10, // Plus 10 seconds to make sure it is older than 2 days.
|
||||||
conditions: ['id' => $taskid2],
|
conditions: ['id' => $taskid2],
|
||||||
);
|
);
|
||||||
|
@ -322,7 +322,7 @@ class adhoc_task_test extends \advanced_testcase {
|
||||||
// Update the time of the task1 to be older than the cleanup time.
|
// Update the time of the task1 to be older than the cleanup time.
|
||||||
$DB->set_field(
|
$DB->set_field(
|
||||||
table: 'task_adhoc',
|
table: 'task_adhoc',
|
||||||
newfield: 'timestarted',
|
newfield: 'firststartingtime',
|
||||||
newvalue: time() - $CFG->task_adhoc_failed_retention - 10, // Plus 10 seconds to make sure it is older than the retention time.
|
newvalue: time() - $CFG->task_adhoc_failed_retention - 10, // Plus 10 seconds to make sure it is older than the retention time.
|
||||||
conditions: ['id' => $taskid1],
|
conditions: ['id' => $taskid1],
|
||||||
);
|
);
|
||||||
|
@ -730,6 +730,74 @@ class adhoc_task_test extends \advanced_testcase {
|
||||||
$this->assertEquals($user->id, $task->get_userid());
|
$this->assertEquals($user->id, $task->get_userid());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test adhoc task with the first starting time.
|
||||||
|
*
|
||||||
|
* @covers ::queue_adhoc_task
|
||||||
|
* @covers ::get_next_adhoc_task
|
||||||
|
* @covers ::adhoc_task_starting
|
||||||
|
* @covers ::adhoc_task_failed
|
||||||
|
*/
|
||||||
|
public function test_adhoc_task_get_first_starting_time(): void {
|
||||||
|
global $DB;
|
||||||
|
$this->resetAfterTest(true);
|
||||||
|
|
||||||
|
$now = time();
|
||||||
|
|
||||||
|
// Create an adhoc task.
|
||||||
|
$task = new adhoc_test_task();
|
||||||
|
// Queue it.
|
||||||
|
$taskid = manager::queue_adhoc_task(task: $task);
|
||||||
|
|
||||||
|
// Get the firststartingtime value.
|
||||||
|
$firststartingtime = $DB->get_field(
|
||||||
|
table: 'task_adhoc',
|
||||||
|
return: 'firststartingtime',
|
||||||
|
conditions: ['id' => $taskid],
|
||||||
|
);
|
||||||
|
$this->assertNull($firststartingtime);
|
||||||
|
|
||||||
|
// This will make sure that the task will be started after the $now value.
|
||||||
|
sleep(3);
|
||||||
|
|
||||||
|
// Get the task from the scheduler.
|
||||||
|
$task = manager::get_next_adhoc_task(timestart: $now);
|
||||||
|
// Mark the task as starting.
|
||||||
|
manager::adhoc_task_starting($task);
|
||||||
|
// Execute the task.
|
||||||
|
$task->execute();
|
||||||
|
// Mark the task as failed.
|
||||||
|
manager::adhoc_task_failed(task: $task);
|
||||||
|
|
||||||
|
// Get the firststartingtime value.
|
||||||
|
$origintimestarted = $DB->get_field(
|
||||||
|
table: 'task_adhoc',
|
||||||
|
return: 'firststartingtime',
|
||||||
|
conditions: ['id' => $taskid],
|
||||||
|
);
|
||||||
|
$this->assertNotNull($origintimestarted);
|
||||||
|
$this->assertGreaterThan($now, $origintimestarted);
|
||||||
|
|
||||||
|
// Get the task from the scheduler.
|
||||||
|
$task = manager::get_next_adhoc_task(timestart: $now + 86400);
|
||||||
|
// Mark the task as starting.
|
||||||
|
manager::adhoc_task_starting($task);
|
||||||
|
// Execute the task.
|
||||||
|
$task->execute();
|
||||||
|
// Mark the task as failed.
|
||||||
|
manager::adhoc_task_failed(task: $task);
|
||||||
|
|
||||||
|
// Get the firststartingtime value.
|
||||||
|
$firststartingtime = $DB->get_field(
|
||||||
|
table: 'task_adhoc',
|
||||||
|
return: 'firststartingtime',
|
||||||
|
conditions: ['id' => $taskid],
|
||||||
|
);
|
||||||
|
|
||||||
|
// The firststartingtime value should not be changed.
|
||||||
|
$this->assertEquals($origintimestarted, $firststartingtime);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test get_concurrency_limit() method to return 0 by default.
|
* Test get_concurrency_limit() method to return 0 by default.
|
||||||
*
|
*
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
|
|
||||||
defined('MOODLE_INTERNAL') || die();
|
defined('MOODLE_INTERNAL') || die();
|
||||||
|
|
||||||
$version = 2024030500.00; // YYYYMMDD = weekly release date of this DEV branch.
|
$version = 2024030500.01; // YYYYMMDD = weekly release date of this DEV branch.
|
||||||
// RR = release increments - 00 in DEV branches.
|
// RR = release increments - 00 in DEV branches.
|
||||||
// .XX = incremental changes.
|
// .XX = incremental changes.
|
||||||
$release = '4.4dev+ (Build: 20240305)'; // Human-friendly version name
|
$release = '4.4dev+ (Build: 20240305)'; // Human-friendly version name
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue