La mise en signet d'un post sur un grand sujet crée des temps de chargement absurdes

Ce fil en particulier me tracassait depuis très longtemps. Je me suis demandé pourquoi il fallait de 1 à 3 minutes pour le charger, s’il décidait même de se charger.

Après avoir vu quelqu’un confirmer ce problème dans ce post, j’ai décidé d’investiguer : j’ai supprimé tous les signets du fil comportant 4 500 messages.

Il s’est chargé instantanément, comme n’importe quel autre post.

Je me suis alors demandé : quelles autres méthodes pourrais-je utiliser pour tester cela ?

  • Que j’aie ou non ajouté un signet au premier ou au dernier message, cela prenait toujours du temps à charger, bien que non des minutes mais environ 10 secondes.
  • L’effet était aggravé sur les fils avec plus de messages ; j’ai l’impression qu’il existe un certain seuil autour de 4 000 messages qui rend les temps de chargement aussi lents.
  • J’ai testé cela sur d’autres fils avec plus de 4 000 messages.
  • Plus un sujet a de signets, plus il met de temps à charger.

Je théorise que plus vous avez de signets sur un sujet comportant de nombreux messages, plus il met de temps à charger.


Pour reproduire : ouvrez un sujet avec beaucoup, beaucoup de messages et ajoutez un signet à l’un d’eux. C’est dommage que le fil référencé nécessite une connexion pour ajouter un signet, et que le fil avec le plus de réponses sur ce site n’en compte que 925.

Si vous avez besoin de plus d’informations, n’hésitez pas à demander.

4 « J'aime »

Je suis presque certain de vous avoir déjà signalé cela, @martin, dans un autre sujet.

2 « J'aime »

Hmm, oui, c’est le cas dans celui-ci : Topics load slow or not at all when they have many replies and user has bookmark in them. Désolé, j’ai visiblement laissé tomber sur celui-là ; je vais déplacer ce problème en haut de ma liste.

2 « J'aime »

C’est également suffisamment grave pour justifier un rétroportage, si cela existe dans la version stable..

3 « J'aime »

J’ai créé un compte sur le forum Roblox pour examiner What are you working on currently? (2020) - #5043 by FLYSLENDY04 - Creations Feedback - Developer Forum | Roblox, et je parviens à reproduire le problème. Sans signet, le sujet se charge en environ 1,3 s ; avec un signet, cela prend environ 8 s. J’ai même rencontré une erreur 502 Bad Gateway :

Cependant, j’ai créé localement un sujet avec 5000 messages et ajouté un signet, et le temps de chargement est identique, que le sujet ait un signet ou non :man_shrugging:. Je vais devoir continuer à chercher… Le code qui charge les signets d’un utilisateur dans un sujet se trouve ici :

Et le code qui recherche un signet pour chaque message est ici :

À mes yeux, cela ne semble ni excessif ni très gourmand en ressources. user_post_bookmarks n’interroge la base de données qu’une seule fois car il est mémoïsé, donc aucun problème de requête N+1 ici. Voici également le code de la vue du sujet pour vérifier s’il existe un signet au niveau du sujet :

Rien de suspect non plus ici…

2 « J'aime »

Est-ce un bug que nous avons déjà corrigé dans une version antérieure ? :thinking:

2 « J'aime »

Je ne pense pas, le forum Roblox est sur la version Version bump to v2.6.0.beta3 · discourse/discourse@2a268bd · GitHub. Depuis, il n’y a eu que deux commits liés aux signets que j’ai effectués, et aucun d’eux ne concerne le chargement ou la sérialisation des signets de sujet.

Il doit y avoir une autre étrange coïncidence en jeu, je suppose ?

1 « J'aime »

Je peux reproduire ce problème sur le BBS.

Il y a quelque chose de louche dans cette requête qui fait planter l’optimiseur. Essayez d’examiner le plan d’exécution et de le modifier légèrement.

Je parie que de très, très petits ajustements permettront de faire passer ce temps d’exécution de près de 4 secondes à 1 milliseconde.

Note à tous les lecteurs : activer MiniProfiler est essentiel ici, car cela peut vous aider à identifier la requête problématique.

5 « J'aime »

Grâce aux conseils de @sam, j’ai découvert que cela était dû à un plan d’exécution de requête médiocre qui est exécuté sur cette ligne :

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

Le SQL généré contient un LIMIT 1, ce qui empêche l’utilisation de l’index index_posts_on_topic_id_and_post_number, provoquant un énorme délai. Je ne parviens pas à reproduire ce problème localement car ma base de données locale contient très peu de publications ; en gros, plus votre forum Discourse complet contient de publications, plus ce problème s’aggrave. Une correction sera disponible sous peu.

3 « J'aime »

Je ferme ce sujet car il s’agit d’un doublon de :

@martin, tu peux publier sur le sujet original une fois le problème résolu.

4 « J'aime »