MDL-61824 core_search: Deleting restored context caused error

When restoring content, this adds it to a queue for indexing. If the
restored content was then deleted before the indexing takes place,
this caused an exception in the scheduled task.

This change makes it continue safely past missing contexts.
This commit is contained in:
sam marshall
2018-04-10 13:07:57 +01:00
parent b08db1daa2
commit 5a4cd49648
2 changed files with 25 additions and 1 deletions
+6 -1
View File
@@ -1138,7 +1138,12 @@ class manager {
}
// Show a message before each request, indicating what will be indexed.
$context = \context::instance_by_id($request->contextid);
$context = \context::instance_by_id($request->contextid, IGNORE_MISSING);
if (!$context) {
$DB->delete_records('search_index_requests', ['id' => $request->id]);
$progress->output('Skipped deleted context: ' . $request->contextid);
continue;
}
$contextname = $context->get_context_name();
if ($request->searcharea) {
$contextname .= ' (search area: ' . $request->searcharea . ')';
+19
View File
@@ -902,5 +902,24 @@ class search_manager_testcase extends advanced_testcase {
// Confirm table is now empty.
$this->assertEquals(0, $DB->count_records('search_index_requests'));
// Make a request for a course context...
$course = $generator->create_course();
$context = context_course::instance($course->id);
$search::request_index($context);
// ...but then delete it (note: delete_course spews output, so we throw it away).
ob_start();
delete_course($course);
ob_end_clean();
// Process requests - it should only note the deleted context.
$search->process_index_requests(10, $progress);
$out = $progress->get_buffer();
$progress->reset_buffer();
$this->assertContains('Skipped deleted context: ' . $context->id, $out);
// Confirm request table is now empty.
$this->assertEquals(0, $DB->count_records('search_index_requests'));
}
}