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