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.
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 . 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 :
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 ?
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.