Erreur dans la tâche programmée "Traitement en tâche de fond du module devoir"

Erreur dans la tâche programmée "Traitement en tâche de fond du module devoir"

par Jean-Gabriel DEPINOY,
Nombre de réponses : 5

Bonjour à tous,

Je tourne actuellement sur Moodle 4.5.2 avec PHP 8.2. Je suis hébergé chez O2Switch.

En consultant mes tâches programmées, je me suis rendu compte que la tâche "Traitement en tâche de fond du module devoir" était en erreur.

Il semblerait, si j'ai bien compris, que le problème vienne d'éléments d'anciens cours qui resteraient dans la BDD alors que les cours en eux-mêmes sont supprimés.

J'ai d'abord eu ce message d'erreur lors du lancement du cron :

Scheduled task failed: Traitement en tâche de fond du module devoir (mod_assign\task\cron_task),Impossible de trouver l’enregistrement de données dans la table context de la base de données. (SELECT * FROM {context} WHERE id = ?
[array (
  0 => '8237',
)])
Debug info:
SELECT * FROM {context} WHERE id = ?
[array (
  0 => '8237',
)]
J'ai donc recherché l'ID 8237 dans la table mdl_context. Cet élément n'existait plus. J'ai essayé de le reconstituer sans succès. J'ai donc supprimé dans la BDD les éléments en lien avec celui-ci.
Une fois ce problème résolu, en lançant à nouveau le cron, je suis tombé sur l'erreur suivante :
Scheduled task failed: Traitement en tâche de fond du module devoir (mod_assign\task\cron_task),Impossible de trouver l’enregistrement de données dans la table course de la base de données. (SELECT id,category FROM {course} WHERE id = ?
[array (
  0 => '1066',
)])
Debug info:
SELECT id,category FROM {course} WHERE id = ?
[array (
  0 => '1066',
)]
Le cours 1066 n'existant plus, j'ai supprimé les différents éléments du cours 1066 que j'ai trouvés dans ma BDD, mais je suis tombé sur une autre erreur :
Scheduled task failed: Traitement en tâche de fond du module devoir (mod_assign\task\cron_task),Impossible de trouver l’enregistrement de données dans la base de données. (SELECT cm.*, m.name, md.name AS modname 
              FROM {course_modules} cm
                   JOIN {modules} md ON md.id = cm.module
                   JOIN {assign} m ON m.id = cm.instance
                   
             WHERE m.id = :instance AND md.name = :modulename
                   
[array (
  'instance' => '476',
  'modulename' => 'assign',
)])
Debug info:
SELECT cm.*, m.name, md.name AS modname 
              FROM {course_modules} cm
                   JOIN {modules} md ON md.id = cm.module
                   JOIN {assign} m ON m.id = cm.instance
                   
             WHERE m.id = :instance AND md.name = :modulename
                   
[array (
  'instance' => '476',
  'modulename' => 'assign',
)]

Puis sur celle-ci :
Scheduled task failed: Traitement en tâche de fond du module devoir (mod_assign\task\cron_task),Impossible de trouver l’enregistrement de données dans la base de données. (SELECT cm.*, m.name, md.name AS modname 
              FROM {course_modules} cm
                   JOIN {modules} md ON md.id = cm.module
                   JOIN {assign} m ON m.id = cm.instance
                   
             WHERE m.id = :instance AND md.name = :modulename
                   
[array (
  'instance' => '478',
  'modulename' => 'assign',
)])
Debug info:
SELECT cm.*, m.name, md.name AS modname 
              FROM {course_modules} cm
                   JOIN {modules} md ON md.id = cm.module
                   JOIN {assign} m ON m.id = cm.instance
                   
             WHERE m.id = :instance AND md.name = :modulename
                   
[array (
  'instance' => '478',
  'modulename' => 'assign',
)]

Puis celle-là :
Scheduled task failed: Traitement en tâche de fond du module devoir (mod_assign\task\cron_task),Impossible de trouver l’enregistrement de données dans la table context de la base de données. (SELECT * FROM {context} WHERE id = ?
[array (
  0 => '8859',
)])
Debug info:
SELECT * FROM {context} WHERE id = ?
[array (
  0 => '8859',
)]

Puis celle-ci :
Scheduled task failed: Traitement en tâche de fond du module devoir (mod_assign\task\cron_task),Impossible de trouver l’enregistrement de données dans la table course de la base de données. (SELECT id,category FROM {course} WHERE id = ? [array ( 0 => '1075', )]) Debug info: SELECT id,category FROM {course} WHERE id = ? [array ( 0 => '1075', )]

Puis celle-ci :
Scheduled task failed: Traitement en tâche de fond du module devoir (mod_assign\task\cron_task),Impossible de trouver l’enregistrement de données dans la base de données. (SELECT cm.*, m.name, md.name AS modname 
              FROM {course_modules} cm
                   JOIN {modules} md ON md.id = cm.module
                   JOIN {assign} m ON m.id = cm.instance
                   
             WHERE m.id = :instance AND md.name = :modulename
                   
[array (
  'instance' => '860',
  'modulename' => 'assign',
)])
Debug info:
SELECT cm.*, m.name, md.name AS modname 
              FROM {course_modules} cm
                   JOIN {modules} md ON md.id = cm.module
                   JOIN {assign} m ON m.id = cm.instance
                   
             WHERE m.id = :instance AND md.name = :modulename
                   
[array (
  'instance' => '860',
  'modulename' => 'assign',
)]

Bref, quelqu'un aurait-il une requête "magique" à lancer pour supprimer tous les éléments restants d'anciens cours et qui perturbent le lancement des crons ?

Merci d'avance aux experts des BDD.

Jean-Gabriel

Moyenne des évaluations  -
En réponse à Jean-Gabriel DEPINOY

Re: Erreur dans la tâche programmée "Traitement en tâche de fond du module devoir"

par Patrick Lemaire,
Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs
Bonjour Jean-Gabriel,
Étrange cette suppression de cours qui n'a pas fait le ménage en partant 🤔

Tu pourrais éventuellement faire la requête suivante (avec "mdl_" comme préfixe de table !) :
SELECT cm.course, cm.instance, m.name FROM mdl_course_modules cm
INNER JOIN mdl_modules m ON cm.module = m.id
WHERE course = XXX;
Ça te donnera une liste de tous les types de ressource/activité qu'il y avait dans ce cours. La suite est plus compliquée à compiler dans le sens où chaque module possède sa propre table.
Il faudra aller dans la table de chaque module remonté pour trouver l'élément concerné.
Par exemple, pour une ressource :
SELECT * FROM mdl_resource
WHERE course = XXX;
Ensuite, je m'interroge sur la procédure de "nettoyage". Supprimer les références directement dans la table amènera à des incohérences comme celle à l'origine de la suppression de ton cours fantôme.

Peut-être que Moosh activity-delete ferait les choses plus proprement ?
En effet, lorsque tu effaces une ressource/activité, il y a souvent une fonction intégrée au plugin qui fait le ménage en partant et qui est appelée au moment de la suppression.

Bon courage pour ce nettoyage imposé,
Patrick
Moyenne des évaluations Utile (1)
En réponse à Patrick Lemaire

Re: Erreur dans les tâches programmées "Traitement en tâche de fond du module devoir" et "Modèles de prédiction"

par Jean-Gabriel DEPINOY,

Bonjour Patrick,

Merci pour ta réponse.

Ma plateforme Moodle est hébergée chez o2switch et, suite à mon message sur ce forum, je me suis rendu compte que O2Switch n'avait plus fait de sauvegardes de mes données depuis 10 jours. Ils ont investigué de leur côté et semblent avoir résolu le problème.

Ce matin, je n'ai plus d'erreurs dans cette tâche programmée. Donc, pour le moment, je ne vais toucher à rien. Mais je garde de côté ta requête qui me semble intéressante, ne serait-ce que pour lister les éléments perturbateurs qu'il pourrait rester sur ma plateforme.

Par contre, j'ai une autre tâche programmée qui pose problème depuis TRES longtemps (4 septembre 2023 !!!) mais je n'y avais pas prêté attention.

J'ai ce message d'erreur :

++ Did you remember to make the first column something unique in your call to get_records? Duplicate value '310' found in column 'analysableid'. ++
* line 1373 of /lib/dml/mysqli_native_moodle_database.php: call to debugging()
* line 1516 of /lib/dml/moodle_database.php: call to mysqli_native_moodle_database->get_records_sql()
* line 160 of /analytics/classes/analysis.php: call to moodle_database->get_records_select()
* line 95 of /analytics/classes/analysis.php: call to core_analytics\analysis->get_processed_analysables()
* line 286 of /analytics/classes/local/analyser/base.php: call to core_analytics\analysis->run()
* line 824 of /analytics/classes/model.php: call to core_analytics\local\analyser\base->get_static_data()
* line 70 of /admin/tool/analytics/classes/task/predict_models.php: call to core_analytics\model->predict()
* line 410 of /lib/classes/cron.php: call to tool_analytics\task\predict_models->execute()
* line 208 of /lib/classes/cron.php: call to core\cron::run_inner_scheduled_task()
* line 125 of /lib/classes/cron.php: call to core\cron::run_scheduled_tasks()
* line 186 of /admin/cli/cron.php: call to core\cron::run_main_process()

Ce message se reproduit sur plusieurs valeurs de la colonne analysableid car j'ai de nombreuses valeurs qui se répètent dans cette colonne.
Est-ce normal ?

Jean-Gabriel

En réponse à Jean-Gabriel DEPINOY

Re: Erreur dans les tâches programmées "Traitement en tâche de fond du module devoir" et "Modèles de prédiction"

par Patrick Lemaire,
Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs
Tu pourrais nous dire précisément quelle tâche ?
Note que ce serait bien d'ouvrir un autre fil de discussion 🤔
En réponse à Patrick Lemaire

Re: Erreur dans les tâches programmées "Traitement en tâche de fond du module devoir" et "Modèles de prédiction"

par Jean-Gabriel DEPINOY,

Oups! Pardon Patrick,

Je suis allé un peu vite. Il s'agit de la tâche Modèles de prédiction (\tool_analytics\task\predict_models)

Jean-Gabriel