Esta discussão em particular me incomodou por muito tempo. Perguntei: por que demora de 1 a 3 minutos para carregar, se é que decide carregar?
Ao ver alguém corroborar esse problema nesta publicação, decidi investigar: removi todos os marcadores da discussão com 4.500 posts.
Ela carregou instantaneamente, como qualquer outra publicação faria.
Então me perguntei: quais outras maneiras eu poderia testar isso?
Independentemente de eu marcar ou não o primeiro post ou o último post, ainda levava um tempo para carregar, embora não fossem minutos, mas cerca de 10 segundos.
O efeito era mais pronunciado em discussões com mais posts; sinto que há um certo limite em torno de 4.000 posts que torna os tempos de carregamento tão lentos.
Testei isso em outras discussões com mais de 4.000 posts.
Quanto mais marcadores um tópico tem, mais tempo leva para carregar.
Minha teoria é que quanto mais marcadores você tem em um tópico com muitos posts, mais tempo leva para carregar.
Para reproduzir: abra um tópico com muitos, muitos posts e marque um. É uma pena que a discussão referenciada exija que você faça login para marcar um post, e que a discussão com o maior número de respostas neste site tenha 925.
Se precisar de mais alguma informação, é só perguntar.
No entanto, criei um tópico com 5000 posts localmente e adicionei um marcador, e ele carrega no mesmo tempo, tanto com quanto sem marcador no tópico . Vou continuar investigando… O código que carrega os marcadores de um usuário em um tópico está aqui:
E o código que encontra um marcador para cada post está aqui:
Para mim, isso não parece nada malicioso ou intensivo em desempenho. user_post_bookmarks consulta o banco de dados apenas uma vez porque é memoizado, então não há problema N+1 aqui. Além disso, aqui está o código da visualização do tópico para verificar se há um marcador no nível do tópico:
Eu não acho que seja isso. O fórum do Roblox está na versão Version bump to v2.6.0.beta3 · discourse/discourse@2a268bd · GitHub. Desde então, houve apenas dois commits relacionados a marcadores que fiz, e nenhum deles faz qualquer coisa com o carregamento ou serialização de marcadores de tópicos.
Deve haver alguma outra coincidência estranha em jogo, suponho?
O SQL gerado contém um LIMIT 1, o que faz com que o índice index_posts_on_topic_id_and_post_number nunca seja utilizado, causando um grande atraso. Não consigo reproduzir isso localmente porque tenho quase nenhum post no banco de dados local; basicamente, quanto mais posts houver em todo o seu fórum Discourse, pior fica esse problema. Em breve, terei uma correção pronta.