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')); } }