Marcar una publicación en un tema grande crea tiempos de carga absurdos

Esta publicación en particular me ha estado molestando durante mucho tiempo. Pregunté: ¿por qué tarda de 1 a 3 minutos en cargar, si es que decide cargar?

Después de ver que alguien apoyaba este problema en esta publicación, decidí investigarlo: eliminé todos los marcadores de la publicación con 4.500 mensajes.

Cargó al instante, como cualquier otra publicación.

Luego me pregunté: ¿qué otras formas podría probar esto?

  • Independientemente de si marcaba el primer mensaje o el último, aún tardaba un tiempo en cargar, aunque no minutos, sino alrededor de 10 segundos.
  • El efecto se agravaba en publicaciones con más mensajes; siento que hay un cierto umbral alrededor de los 4.000 mensajes que hace que los tiempos de carga sean tan lentos.
  • Probé esto en otras publicaciones con más de 4.000 mensajes.
  • Cuantos más marcadores tenga un tema, más tiempo tardará en cargar.

Mi teoría es que cuanto más marcadores tengas en un tema con muchos mensajes, más tiempo tardará en cargar.


Para reproducir: Abre un tema con muchos, muchos mensajes y marca uno. Es una lástima que la publicación de referencia requiera que inicies sesión para marcar un mensaje, y que la publicación con más respuestas en este sitio web tenga 925.

Si necesito proporcionar más información, no dudes en preguntar.

4 Me gusta

Estoy bastante seguro de que ya te reporté esto antes, @martin, en otro tema.

2 Me gusta

Sí, lo hiciste en este: Topics load slow or not at all when they have many replies and user has bookmark in them. Lo siento, parece que se me pasó ese tema; lo moveré al principio de mi lista.

2 Me gusta

Esto es lo suficientemente grave como para que deba ser retrotraído, si existe en la versión estable.

3 Me gusta

Creé una cuenta en el foro de Roblox para ver What are you working on currently? (2020) - #5043 by FLYSLENDY04 - Creations Feedback - Developer Forum | Roblox, y pude reproducir el problema allí. Sin un marcador, el tema carga en ~1.3s; con un marcador, tarda ~8s. Incluso encontré el error 502 Bad Gateway:

Sin embargo, creé un tema localmente con 5000 publicaciones y un marcador, y carga en el mismo tiempo tanto si tengo un marcador en el tema como si no :man_shrugging:. Tendré que seguir investigando… El código que carga los marcadores de un usuario en un tema está aquí:

Y el código que busca un marcador para cada publicación está aquí:

Para mí, esto no parece exagerado ni intensivo en rendimiento. user_post_bookmarks solo consultará la base de datos una vez porque está memoizado, así que no hay problema N+1 aquí. Además, aquí está el código de la vista del tema para verificar si hay un marcador a nivel de tema:

Tampoco hay nada sospechoso allí…

2 Me gusta

¿Podría ser un error que ya solucionamos en una versión anterior? :thinking:

2 Me gusta

No lo creo, el foro de Roblox está en la versión Version bump to v2.6.0.beta3 · discourse/discourse@2a268bd · GitHub. Desde entonces, solo ha habido dos commits relacionados con marcadores que hice yo, y ninguno de ellos afecta la carga o serialización de marcadores de temas.

Supongo que debe haber alguna otra coincidencia extraña en juego, ¿no?

1 me gusta

Puedo reproducir esto en el BBS

Hay algo incorrecto en esa consulta que está confundiendo al planificador. Intenta revisar el plan y ajustarlo un poco.

Mi suposición es que algunos cambios muy, muy pequeños reducirán el tiempo de casi 4 segundos a 1 milisegundo.

Nota para todos los lectores: tener habilitado MiniProfiler es clave aquí; puede ayudarte a encontrar la consulta problemática.

5 Me gusta

Gracias al consejo de @sam, descubrí que esto se debe a un plan de consulta deficiente que se ejecuta en esta línea:

topic.posts.with_deleted.where(post_number: 1).first

El SQL generado incluye un LIMIT 1, lo que hace que el índice index_posts_on_topic_id_and_post_number nunca se utilice, provocando un retraso considerable. No puedo reproducir esto localmente porque apenas tengo publicaciones en la base de datos local; básicamente, cuanto más publicaciones tenga todo tu foro Discourse, peor se vuelve este problema. Pronto tendré una solución lista.

3 Me gusta

Cerrando esto como duplicado de:

@martin, puedes publicar en el tema original allí una vez resuelto.

4 Me gusta