diff --git a/search/classes/manager.php b/search/classes/manager.php index e80c899e97b..5345b6cbd5e 100644 --- a/search/classes/manager.php +++ b/search/classes/manager.php @@ -1303,7 +1303,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 675bc6f0718..124e04ab984 100644 --- a/search/tests/manager_test.php +++ b/search/tests/manager_test.php @@ -1190,5 +1190,24 @@ class search_manager_testcase extends advanced_testcase { $this->assertContains( 'Completed requested context: Forum: TForum1 (search area: mod_forum-activity)', $out); + + // 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')); } }