No se puede "Eliminar todas las publicaciones" cuando hay publicaciones que pertenecen a un megatema

Estoy experimentando un problema en mi comunidad. No puedo «eliminar todas las publicaciones» de ciertos usuarios. Por lo que puedo ver, esto solo ocurre con cuentas antiguas que tienen muchas publicaciones. Las cuentas nuevas no tienen este problema.

He revisado la configuración del sitio y he aumentado el límite para «eliminar todas las publicaciones» a 10 000.

Actualmente estoy intentando eliminar un usuario con alrededor de 900 publicaciones. El usuario no quiere ser anonimizado y amenaza con tomar acciones legales si la cuenta y las publicaciones no se eliminan. Presiono el botón «eliminar todo» y, después de aproximadamente un minuto, aparece este mensaje:

Veo esto en la consola de mi navegador: error 502 en la publicación:
image

He revisado los registros de mi servidor y veo esto aparecer después de intentar eliminar:

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

¿Hay algún lugar donde pueda buscar para encontrar el origen del problema? ¿Registros?

1 me gusta

Intenta ir a Administración / Registros / Registros de errores. Luego, intenta eliminar las publicaciones nuevamente. Es de esperar que haya una entrada en el registro para la publicación que está causando el problema.

4 Me gusta

Este es el error que aparece en el registro después de intentar eliminar todas las publicaciones:

TypeError: undefined no es un objeto (evaluando 's.users')
URL: https://myserver.com/assets/ember_jquery-d430881a3fb1403871256e5a02423c4b20a78793685e92088613ca9a701baf88.js
Línea: 9
Columna: 8994
Ubicación de la ventana: https://myserver.com/t/topic/64828/2502
1 me gusta

He notado que elimina algunos mensajes (unos 5) antes de que aparezca el cuadro de diálogo de error. No sé si esto es relevante.

Tienes razón, debería haber leído tu mensaje con más atención.

Parece que falla en el tema con el id 64828. ¿Ha creado el usuario mensajes en este tema?

Disculpas, tras una inspección más detallada, parece que ese error está relacionado con otra cosa.
Ahora estoy viendo este y sospecho que podría deberse a un tiempo de espera agotado en la solicitud:

image

También intenté realizar la eliminación mediante una solicitud de API, pero supongo que sería lo mismo que en la interfaz de usuario.

Escribí una pequeña aplicación que llama a la API de Discourse en mi instalación. Elimina cada publicación individualmente en lugar de hacerlo en lote. Así que, para 700 publicaciones, realizaría 700 llamadas a la API. No es lo más eficiente, pero fue útil.

Veo que hay 20 publicaciones problemáticas. Parece que la función “eliminar todo” se detiene al encontrar una de estas y no puede eliminarlas. Por alguna razón, la API no pudo eliminarlas. Ahora las he eliminado manualmente la mayoría entrando en cada publicación y pulsando el botón de eliminar, como lo haría normalmente un moderador.

Aún quedan unas 5 que no puedo eliminar, ni mediante la API ni de forma normal. No veo ninguna similitud entre ellas. Algunas están en temas muy grandes, otras en temas pequeños. Algunas son respuestas, tienen “me gusta”, tienen imágenes, otras no. Cuando intento eliminarlas a través de la interfaz estándar, aparece este cuadro de diálogo de error:

Algunos de mis usuarios han reportado recibir el mismo cuadro de diálogo cuando intentan eliminar sus propias publicaciones. Asumí que se debía a un problema de conexión o algo similar, ya que casi todos están en dispositivos móviles, pero podría ser algo diferente.

Al intentar eliminarlas manualmente, obtengo este registro:
23

¿Alguna idea o sugerencia?

Los cinco mensajes problemáticos se encuentran todos dentro de dos temas grandes. Recientemente cerramos ambos porque se estaban volviendo demasiado grandes. Uno de los temas tiene 55 mil mensajes y el otro tiene 17 mil. Supongo que hay mucho procesamiento involucrado cuando se elimina un mensaje dentro de un tema tan grande, y eso está causando algún tipo de tiempo de espera, pero eso es solo una suposición.

1 me gusta

Ahora estoy atascado. No puedo eliminar las publicaciones en esos temas extensos ni puedo eliminar los temas. Ambos casos terminan con el diálogo de error 502 Gateway.

:scream:

¿Has intentado eliminar estas 5 publicaciones usando la consola?

./launcher enter app
rails c
Post.find(THE_POST_ID).destroy
2 Me gusta

¡Sí! Eso funciona. No sé nada de Ruby o Rails, pero puedo encadenar varios posts en un solo comando así:

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

Probablemente usaré esto en algún momento cuando haya algunos posts que se queden atascados. ¿Es posible (y seguro) eliminar un tema de esta manera también?

Por lo general, los mensajes en Discourse solo se eliminan de forma blanda (soft-delete) y no de forma permanente (hard-delete). Con el comando destroy, simplemente los has eliminado de la base de datos. Solo te hice usarlo porque los mensajes que intentabas eliminar pertenecían a temas extremadamente largos.

No recomiendo usar este método ni para mensajes ni para temas. Nunca podrán restaurarse y, por lo que entiendo, estarás trabajando en una base de datos de un sitio en producción, con el riesgo de romper todo el sitio si algo sale mal. Sin embargo, si deseas usar el comando destroy, eres libre de hacerlo. Siempre debes realizar una copia de seguridad si planeas usar este tipo de comandos.

Para eliminar permanentemente un tema, ejecuta:

Topic.find(THE_TOPIC_ID).destroy
1 me gusta

Solo una nota para indicar que, para evitar este tipo de problemas de rendimiento :arrow_up:, también hemos introducido algunas configuraciones para evitar la creación de megatopics. Consulta The MEGATOPIC: public good, or public menace? para más detalles.

2 Me gusta

Gracias por el consejo. Es exactamente lo que esperaba, y solo usaré el comando destroy como último recurso.

Dado que normalmente se trata de una eliminación suave de los posts, parece que escribe una serie de cosas adicionales en lugar de simplemente borrar el registro. ¿Será esta la razón por la que no funciona bien al eliminar posts de un mega tema? ¿Quizás hay demasiadas cosas que hacer y se produce un tiempo de espera?

Me encantaría encontrar una forma de resolver esto sin recurrir al comando de consola, que es arriesgado.

Gracias. He cambiado nuestro límite máximo de temas a 2500. Hace un tiempo, los usuarios pidieron que se eliminara el límite, lo que dio lugar a estos temas masivos. Sin embargo, los temas masivos no son buenos para el foro. El rendimiento del servidor se vio gravemente afectado durante los momentos de mayor actividad cuando mucha gente respondía a ellos. Terminamos cerrándolo para evitar que eso volviera a ocurrir, pero ahora seguimos atascados con estos temas masivos que están causando otros problemas.

La solución más sencilla es que algunos moderadores se pongan manos a la obra y comiencen a dividir (y luego cerrar) los megatemas en varios temas, por ejemplo:

  • :lock:[Título del megatema] parte 1
  • :lock:[Título del megatema] parte 2
  • :lock:[Título del megatema] parte 3
  • :lock:[Título del megatema] parte […]
  • :unlock:[Título del megatema] parte 10

Cada parte se vinculará automáticamente a la anterior y a la siguiente, por lo que los usuarios no deberían tener dificultades de navegación y, sin duda, se resolverá el problema de rendimiento.

Sí, será un trabajo aburrido, pero esta es también una de las razones por las que tener un tema con 55 mil o 17 mil publicaciones es absolutamente inútil, ya que nadie las leerá.

4 Me gusta

¡Ahora tenemos una función (configuración del sitio) exactamente para este caso de uso!

4 Me gusta