Impossible de « Supprimer tous les messages » lorsqu'il existe des messages appartenant à un mégasujet

Je rencontre un problème sur ma communauté. Je ne parviens pas à « supprimer tous les messages » de certains utilisateurs. À en juger par ce que j’observe, cela ne concerne que les anciens comptes comportant un grand nombre de messages. Les nouveaux comptes ne sont pas confrontés à ce problème.

J’ai vérifié les paramètres du site et j’ai augmenté la limite de suppression de tous les messages à 10 000.

J’essaie actuellement de supprimer un utilisateur ayant environ 900 messages. Cet utilisateur ne souhaite pas être anonymisé et menace d’engager des poursuites judiciaires si le compte et les messages ne sont pas supprimés. Lorsque je clique sur le bouton « Tout supprimer », j’obtiens le message suivant après environ une minute :

Je vois ceci dans la console de mon navigateur, une erreur 502 sur le message :
image

J’ai examiné les journaux de mon serveur et j’ai constaté l’apparition de ce message après avoir tenté la suppression :

TypeError: undefined is not an object (evaluating ‘s.users’)
Url: https://myserver.com/assets/ember_jquery-d430881a3fb1403871256e5a02423c4b20a78793685e92088613ca9a701baf88.js
Line: 9
Column: 8994
Window Location: https://myserver/t/topic/64828/2502

Y a-t-il un endroit où je pourrais chercher pour identifier la source du problème ? Des journaux ?

1 « J'aime »

Essayez d’aller dans Admin / Journaux / Journaux d’erreurs. Ensuite, réessayez de supprimer les messages. Espérons qu’une entrée de journal apparaîtra pour le message qui cause le problème.

4 « J'aime »

Voici l’erreur qui apparaît dans le journal après avoir tenté de supprimer tous les messages :

TypeError: undefined n'est pas un objet (évaluation de 's.users')
Url : https://myserver.com/assets/ember_jquery-d430881a3fb1403871256e5a02423c4b20a78793685e92088613ca9a701baf88.js
Ligne : 9
Colonne : 8994
Emplacement de la fenêtre : https://myserver.com/t/topic/64828/2502
1 « J'aime »

Je remarque qu’il supprime quelques publications (environ 5) avant que la boîte de dialogue d’erreur n’apparaisse. Je ne sais pas si cela est pertinent.

Bien, j’aurais dû lire votre message plus attentivement.

Il semble que cela échoue pour le sujet ayant l’identifiant 64828. L’utilisateur a-t-il créé des messages dans ce sujet ?

Veuillez nous excuser, après un examen plus attentif, cette erreur semble liée à autre chose.
Je vois maintenant ceci et je soupçonne qu’elle pourrait être due à un délai d’attente de la requête :

image

J’ai également essayé de procéder à la suppression via une requête API, mais je suppose que cela reviendrait au même que l’interface utilisateur.

J’ai écrit une petite application qui appelle l’API Discourse sur mon installation. Elle supprime chaque message individuellement, plutôt que par lot. Donc, pour 700 messages, cela génère 700 appels API. Ce n’est pas très efficace, mais cela m’a été utile.

Je constate qu’il y a 20 messages problématiques. Il semble que la fonction « tout supprimer » s’arrête dès qu’elle rencontre l’un de ces messages et ne peut pas les supprimer. L’API n’a pas pu les supprimer pour une raison quelconque. J’ai supprimé manuellement la plupart d’entre eux en accédant au message et en cliquant sur le bouton supprimer, comme le ferait normalement un modérateur.

Il reste environ 5 messages que je ne peux pas supprimer, ni via l’API ni par la méthode normale. Je ne vois aucune ressemblance entre eux. Certains se trouvent dans des sujets très longs, d’autres dans des sujets courts. Certains sont des réponses, ont des likes, contiennent des images, d’autres non. Lorsque j’essaie de les supprimer via l’interface utilisateur standard, j’obtiens cette boîte de dialogue d’erreur :

Certains de mes utilisateurs ont signalé recevoir la même boîte de dialogue lorsqu’ils tentent de supprimer leurs propres messages. J’ai supposé que cela était dû à un problème de connexion ou autre, puisque presque tous sont sur mobile, mais cela pourrait être quelque chose de différent.

Lorsque j’essaie de les supprimer manuellement, j’obtiens ce journal :
23

Des idées ou suggestions ?

Les cinq publications problématiques se trouvent toutes dans deux grands sujets. Nous avons récemment fermé les deux car ils devenaient beaucoup trop volumineux. L’un des sujets compte 55 000 publications et l’autre 17 000. Je suppose qu’il y a beaucoup de traitement impliqué lorsqu’une publication au sein d’un sujet aussi vaste est supprimée, ce qui provoque un dépassement de délai d’une certaine nature, mais ce n’est qu’une hypothèse.

1 « J'aime »

Je suis maintenant bloqué. Je ne peux pas supprimer les messages dans ces longs sujets, et je ne peux pas non plus supprimer les sujets eux-mêmes. Les deux opérations aboutissent à une fenêtre d’erreur 502 (Gateway).

:scream:

Avez-vous essayé de supprimer ces 5 messages en utilisant la console ?

./launcher enter app
rails c
Post.find(THE_POST_ID).destroy
2 « J'aime »

Oui ! Ça fonctionne. Je ne connais pas du tout Ruby ou Rails, mais je parviens à enchaîner plusieurs suppressions de messages dans une seule commande comme ceci :

Post.find(POST1_ID).destroy; Post.find(POST2_ID).destroy

J’utiliserai probablement cette méthode à un moment donné lorsque quelques messages resteront bloqués. Est-il possible (et sûr) de supprimer également un sujet de cette manière ?

En général, les publications sur Discourse sont simplement supprimées de manière douce et non définitive. Avec la commande destroy, vous les avez simplement supprimées de la base de données, et je vous ai seulement fait l’utiliser parce que les publications que vous tentiez de supprimer appartenaient à des sujets incroyablement longs.

Je déconseille cette méthode, tant pour les publications que pour les sujets. Elles ne peuvent jamais être restaurées, et vous travaillez, d’après ce que je comprends, sur une base de données pour un site en production, avec le risque de casser l’ensemble du site si quelque chose tourne mal. Cependant, si vous souhaitez utiliser la commande destroy, vous êtes libre de le faire. Vous devriez toujours faire une sauvegarde si vous envisagez d’utiliser ce type de commandes.

Pour supprimer définitivement un sujet, exécutez

Topic.find(LE_ID_DU_SUJET).destroy
1 « J'aime »

Juste une note pour dire que, afin d’éviter ce type de problèmes de performance :arrow_up:, nous avons également introduit certains paramètres pour empêcher la création de mégasujets. Consultez The MEGATOPIC: public good, or public menace? pour plus de détails.

2 « J'aime »

Merci pour le conseil. C’est à peu près ce que je m’attendais à entendre, et je n’utiliserai la commande destroy qu’en dernier recours.

Puisque la suppression des messages est normalement douce (soft delete), cela semble impliquer l’écriture d’un certain nombre d’autres éléments plutôt que la simple suppression de l’enregistrement. Serait-ce la raison pour laquelle cela ne fonctionne pas bien lors de la suppression de messages d’un sujet géant ? Trop de choses à traiter, ce qui entraîne un dépassement de délai ?

J’aimerais trouver un moyen de résoudre ce problème sans avoir recours à la commande console risquée.

Merci. J’ai modifié notre limite maximale de sujets à 2500. Il y a quelque temps, les utilisateurs ont demandé la suppression de cette limite, ce qui a donné naissance à ces sujets géants. Cependant, ces sujets géants ne sont pas bons pour le forum. Les performances du serveur ont été fortement impactées pendant les heures de pointe, lorsque de nombreuses personnes y répondaient. Nous avons fini par les fermer pour éviter que cela ne se reproduise, mais nous sommes toujours coincés avec ces sujets massifs qui causent d’autres problèmes.

La solution la plus simple consiste à ce que certains modérateurs se mettent au travail et commencent à diviser (puis fermer) les mégasujets en plusieurs sujets, par exemple :

  • :lock:[Titre du mégasujet] partie 1
  • :lock:[Titre du mégasujet] partie 2
  • :lock:[Titre du mégasujet] partie 3
  • :lock:[Titre du mégasujet] partie […]
  • :unlock:[Titre du mégasujet] partie 10

Chaque partie sera automatiquement liée à la partie précédente et suivante, de sorte que les utilisateurs ne devraient pas rencontrer de difficultés de navigation, et vous résoudrez définitivement le problème de performance.

Oui, ce sera un travail ennuyeux à faire, mais c’est aussi l’une des raisons pour lesquelles avoir un sujet avec 55 000 ou 17 000 messages est absolument inutile, puisque personne ne les lira.

4 « J'aime »

Nous disposons désormais d’une fonctionnalité (paramètre du site) conçue exactement pour ce cas d’usage !

4 « J'aime »