moodle 3.5.4
Столкнулись со странным эффектом - при попытке оценить задание в одном из курсов система задумывается на 3 минуты (max_execution_time = 180) и выдает окошко "undefined". Оценка при этом записывается.
Выяснилось, что оно зацикливается в lib/gradelib.php:grade_regrade_final_grades()
Я сделал просто - ограничил число циклов в grade_regrade_final_grades() (1000 циклов должно хватать IMHO).
После этого я зашел в раздел "Оценки", где moodle мне радостно заявила "Ошибка! Вероятна циклическая ссылка или неверная формула расчета", после чего проблема с оценкой задания исчезла!
Вопрос - как правильно пофикисить эту проблему? Нет ли возможности сначала проверить корректность формул расчета оценок, а потом уже оценивать?
Я пока не совсем понимаю, как удалось создать эту ситуацию.
Сейчас заплатка выглядит так:
diff --git a/lib/gradelib.php b/lib/gradelib.php
index e87b15b..5acf55e 100644
--- a/lib/gradelib.php
+++ b/lib/gradelib.php
@@ -1189,6 +1189,7 @@ function grade_regrade_final_grades($courseid, $userid=null, $updated_item=null,
$updatedids = array();
$gids = array_keys($grade_items);
$failed = 0;
+ $ccount = 1000; # count($gids)*2 + 1;
while (count($finalids) < count($gids)) { // work until all grades are final or error found
foreach ($gids as $gid) {
@@ -1273,7 +1274,8 @@ function grade_regrade_final_grades($courseid, $userid=null, $updated_item=null,
}
}
- if (count($finalids) == 0) {
+ $ccount--;
+ if (count($finalids) == 0 || $ccount < 0) {
$failed++;
} else {
$failed = 0;