Problème lors de la duplication d'une ressource test

Re: Problème lors de la duplication d'une ressource test

par Steve Ottevaere,
Nombre de réponses : 8

Voila je crois avoir identifié l'érreur.

Il s'agit d'un bug connu et documenté ici MDL-63260


Une enseignante a dupliqué un "test" avec une question de type "random" et cela a engendré l'écriture d'un nombre énorme de ligne (et c'est rien de le dire) dans la table mdl_question.

Le scenario qui a été fait par l’enseignante était celui-ci :

- Créer un test T1 avec une question random

- Dupliquer le test T1, le renomer en T2, modifier le test T2

- Dupliquer le test T2, le renomer en T3, modifier le test T3

et ainsi de suite



Apparemment à chaque tentative de duplication du test (qui se solde par un échec), le nombre de ligne écrite en DB est exponentiellement croissant.


select count(*) from mdl_question

Le nombre de ligne dans ma table est de 1243378 !!!


select count(*) from mdl_question where qtype='random'

Le nombre de ligne de type "random" est  1227160


Au début de mon investigation sur ce problème, j'avais moi même avec mon compte administrateur de moodle tenté de dupliquer le test avec un échec.


select count(*) from mdl_question where qtype='random' and createdby=2

Une petite recherche dans la table me montre que mon utilisateur administrateur de Moodle (dont l'Id est 2) a créé à lui seul 919684 lignes.


Pour nettoyer cette table, pensez-vous que je peux effacer ces lignes sans compromettre encore plus la cohérence de la DB?


Steve.






Moyenne des évaluations Utile (2)
En réponse à Steve Ottevaere

Re: Problème lors de la duplication d'une ressource test

par Luiggi Sansonetti,
Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Titulaires du Moodle Course Creator Certificate Avatar Traducteurs

Bonjour

Je ne réponds pas, mais je voulais juste dire merci pour avoir été jusqu'au bout de la recherche est d'avoir trouvé qu'il s'agissait d'un bug avéré

Oui

Maintenant, l n'y a plus qu'à.

Pour la suppression, dans le ticket mentionné, à la fin, il y en a un qui donne sa requête mais bon, je ne suis pas du tout spécialiste...

En réponse à Steve Ottevaere

Re: Problème lors de la duplication d'une ressource test

par Patrick Lemaire,
Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour Steeve,

Tu écris :

select count(*) from mdl_question where qtype='random' and createdby=2
Une petite recherche dans la table me montre que mon utilisateur administrateur de Moodle (dont l'Id est 2) a créé à lui seul 919684 lignes.
Pour nettoyer cette table, pensez-vous que je peux effacer ces lignes sans compromettre encore plus la cohérence de la DB?

Je pense qu'il n'est jamais bon de supprimer des éléments directement dans la base de données. En effet, d'autres objets sont probablement liés à ces questions et ils seront alors orphelins. Comme on peut le voir sur le schéma de la structure de la Base de données (http://www.examulator.com/er/), la table mdl_question est très utilisées. On peut avoir plus de précision ici : https://docs.moodle.org/dev/Question_database_structure

Database question structure

Pour résumer, je n'en ferai rien pensif

A bientôt,
Patrick

Moyenne des évaluations Utile (2)
En réponse à Patrick Lemaire

Re: Problème lors de la duplication d'une ressource test

par Steve Ottevaere,

Bonjour Patrick,

 

Merci pour ton avis et pour le schéma des tables.

 

Pour info :

Avant de lire ton email, j'avais déjà pris l'initiative de nettoyer la table (en tournant 7 fois mon doigts autour de la souris) j'espère que je ne le regretterai pas...

Dans notre cas, la situation devenait assez critique et je ne pouvais pas laisser la situation dans l'état.

La table étant "polluée" de 1.254.579 enregistrements (plus d'un million de lignes).

Ce qui engendrait des lenteurs dans le traitement de requêtes sur cette table et cela avait un impact négatif sur la charge du serveur.

En plus, d'après ce que je comprends du bug, à chaque duplication les données augmentent exponentiellement, je crois que si le prof tentait de dupliquer de nouveau son "test", on passait à plusieurs dizaines de millions d'enregistrements supplémentaires, ce qui aurait encore empiré la situation (la dernière tentative de duplication avait engendré 800.000 lignes).

Depuis l'effacement des lignes, on retrouve une charge serveur tout à fait normale.

 

Pour info, j'ai utilisé la requête qui est proposée dans le rapport de bug (MDL-63260) et qui n'efface que des enregistrements qui sont orphelins. En effet, effacer sur base de ma requête simpliste de mon précédent post n'était surement pas une bonne idée.


D'autres utilisateurs touchés par ce bug ont "forké" le type de question random en y ajoutant une tâche planifié Moodle qui détecte et efface les enregistrements orphelins, voir la discussion ici : https://moodle.org/mod/forum/discuss.php?d=377361#p1521842)

 

Toutefois, je suis de ton avis, cette manipulation comporte des risques. Il est toujours préférable de la tester dans un environnement de test.

Si un utilisateur est confronté à ce problème mais n’a pas d’impact négatif sur les performances, je préconiserais de laisser en l'état en gardant cela à l’œil et en espérant qu'une procédure officielle de Moodle détecte ces enregistrements et efface les enregistrements fantômes car surcharger les tables avec un tel nombre d’enregistrements n'est pas non plus une situation idéale.


En tout cas merci pour les retours et j'espère ce cette discussion pour être utile à d'autres.

 

Steve.


Moyenne des évaluations Utile (1)
En réponse à Steve Ottevaere

Re: Problème lors de la duplication d'une ressource test

par Steve Ottevaere,

J'update le ticket car la situation a évolué.


Le problème vient d'être géré par la communauté.

Une tache planifiée de nettoyage des questions inutiles a été ajouté au noyau Moodle

Il suffit de mettre à jour Moodle et de lancer cette tâche de nettoyage

php admin/tool/task/cli/schedule_task.php --execute=\\qtype_random\\task\\remove_unused_questions 


Voila qui est plus propre et qui annule les bidouillages décrits ci dessus.

A mon avis, ce n'est plus une bonne idée de faire ces bidouillages maintenant qu'il existe une solution officielle sourire


Steve.

Moyenne des évaluations Utile (1)
En réponse à Steve Ottevaere

Re: Problème lors de la duplication d'une ressource test

par Patrick Lemaire,
Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour Steve,

En effet, Tim Hunt (merci à lui) a corrigé le bug référencé MDL-63260 (à savoir « Duplicating quiz with random question has exponential questions growth ».

Sachez tout de même que le correctif est intégré dans les versions Moodle 3.5 et supérieures. Si vous avez une version inférieure, il est temps de mettre à jour votre plateforme langue tirée

A bientôt,
Patrick

En réponse à Patrick Lemaire

Re: Problème lors de la duplication d'une ressource test

par Nicolas Mouillet,

Bonjour,

Nos enseignants utilisent beaucoup la duplication des questionnaires, nous avons donc également rencontré ce bug. Nous avions 12.300.000 entrées inutilement créées dans la base de données suivant cette requête:

SELECT q.id FROM mdl_question AS q 
LEFT JOIN mdl_quiz_slots AS qslots ON q.id = qslots.questionid
WHERE qslots.questionid IS NULL AND q.qtype = 'random'

Votre discussion ici m'a bien aidé. J'ai donc testé le patch de Tim Hunt. En réalité il ne s'agit pas vraiment d'un patch mais plutôt d'une tâche planifié de nettoyage de la base de données. Les questionnaires sont toujours dupliqués mais la tâche planifiée de Moodle (via le cron) efface petit à petit les questionnaires superflus, par lot de 10000 toutes les 12h par défaut (cfr. les "Tâches programmées" dans Moodle: "Nettoyage du questionnaire" - \mod_questionnaire\task\cleanup).

Autant dire que dans notre cas, ce patch n'a pas été suffisant, même en modifiant la fréquence de la tâche planifiée. J'ai donc appliqué cette requête directement en base de données pour supprimer d'une traite toutes les entrées en trop (backups réalisés au préalable):

DELETE FROM mdl_question 
WHERE id IN 
(
SELECT ids.id 
    FROM (
SELECT q.id 
        FROM mdl_question AS q 
LEFT JOIN mdl_quiz_slots AS qslots ON q.id = qslots.questionid
WHERE qslots.questionid IS NULL AND q.qtype = 'random' 
) ids
)

Au final, la duplication des questionnaires fonctionne à nouveau mais prend du temps, et de plus en plus de temps à chaque duplication jusqu'au prochain nettoyage par la tâche planifiée de Tim Hunt. La solution "long terme" proposée par Tim Hunt semble être de supprimer le type de question "random": https://tracker.moodle.org/browse/MDL-64595 et le remplacer par un autre mode de fonctionnement: https://tracker.moodle.org/browse/MDL-61267


Nicolas

Moyenne des évaluations Utile (4)
En réponse à Nicolas Mouillet

Re: Problème lors de la duplication d'une ressource test

par Joseph Rézeau,
Avatar Développeurs Avatar Développeurs de plugins Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

"Nos enseignants utilisent beaucoup la duplication des questionnaires, nous avons donc également rencontré ce bug."

Attention à ne pas confondre le nom de ces 2 types d'activité:

l'activité Quiz (en français Test)

l'activité Questionnaire (en français Questionnaire)

En réponse à Joseph Rézeau

Re: Problème lors de la duplication d'une ressource test

par Nicolas Mouillet,

En effet, je fais souvent l'amalgame. Il s'agit bien de l'activité Test.

Merci pour la correction.