From 5a4cd49648b75d2a0facd905df24ea6dde8f33ab Mon Sep 17 00:00:00 2001 From: sam marshall Date: Mon, 9 Apr 2018 16:35:51 +0100 Subject: [PATCH] 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. --- search/classes/manager.php | 7 ++++++- search/tests/manager_test.php | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/search/classes/manager.php b/search/classes/manager.php index fc5a7188e10..8a44bbf8dc0 100644 --- a/search/classes/manager.php +++ b/search/classes/manager.php @@ -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 . ')'; diff --git a/search/tests/manager_test.php b/search/tests/manager_test.php index 95fa82c1f47..617ead6ac6b 100644 --- a/search/tests/manager_test.php +++ b/search/tests/manager_test.php @@ -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')); } }