zestedesavoir / zds-site

Cœur du projet technique de Zeste de Savoir
https://zestedesavoir.com
Other
268 stars 161 forks source link

La modération d'un billet pendant son export fait planter le watchdog #6560

Open philippemilink opened 11 months ago

philippemilink commented 11 months ago

Si un modérateur modère un billet (= supprime la version publique) pendant que le watchdog est en train d'exporter ce billet, le watchdog va planter lorsque l'export sera terminé (si une erreur se produit dans l'export en lui-même, elle sera rattrapée), au moment de vouloir mettre à jour l'état de la demande d'export (PublicationEvent).

Une façon de provoquer le bug est la suivante :

  1. Lancer make start-publication-watchdog et attendre que le watchdog n'ait plus rien à faire
  2. Ajouter time.sleep(30) à la fin du fichier, à la fin et dans le for (ici), de façon à faire une pause entre le traitement de deux publication_events (pour simuler qu'un export dure 30 secondes)
  3. Relancer le watchdog
  4. Se connecter en tant qu'admin, aller sur la version brouillon d'un billet publié et demander la génération de tous les exports
  5. Le watchdog exporte le premier format demandé, puis fait la pause. Pendant cette pause, revenir sur la version publique du billet et le modérer.
  6. Le watchdog plante en essayer de mettre à jour l'événement de publication, mais le PublishedContent que référence ce PublicationEvent n'existe plus...

Solution : probablement empêcher la suppression d'un contenu public si celui-ci est en train d'être exporté par le watchdog. On ne peut sans doute pas attendre dans la requête de modération que l'export soit terminé (même si c'est pour le supprimer juste après), car certains exports peuvent prendre plusieurs minutes...

Ceci dit, ce problème a peu de chance d'arriver en pratique (modérer un billet juste après sa publication -- ok, en cas de spam...) et ne casse pas la cohérence des données, donc je dirais que c'est un bug avec une priorité relativement basse...

Arnaud-D commented 1 month ago

Probablement à traiter en même temps que #6638.