Salvar um post em um tópico grande cria tempos de carregamento absurdos

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.

4 curtidas

Tenho quase certeza de que já relatei isso a você antes, @martin, em outro tópico.

2 curtidas

Hmm, sim, você tem razão, neste aqui: Topics load slow or not at all when they have many replies and user has bookmark in them. Desculpe, parece que falhei nessa; vou mover esse problema para o topo da minha lista.

2 curtidas

Isso também é ruim o suficiente para ser backportado, se existir na versão estável.

3 curtidas

Criei uma conta no fórum do Roblox para verificar What are you working on currently? (2020) - #5043 by FLYSLENDY04 - Creations Feedback - Developer Forum | Roblox, e consegui reproduzir o problema lá. Sem um marcador, o tópico carrega em ~1,3s; com um marcador, leva ~8s. Cheguei até a encontrar o erro 502 bad gateway:

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

Também não há nada suspeito por aqui…

2 curtidas

Pode ser um bug que já corrigimos em uma versão anterior? :thinking:

2 curtidas

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?

1 curtida

Consegui reproduzir isso no BBS

Algo está errado nessa consulta que está confundindo o otimizador. Tente examinar o plano de execução e fazer alguns ajustes nele.

Minha suposição é que algumas alterações muito, muito pequenas vão reduzir o tempo de execução de quase 4 segundos para 1 milissegundo.

Nota para todos os leitores: ter o MiniProfiler habilitado é fundamental aqui; ele pode ajudá-lo a encontrar a consulta problemática.

5 curtidas

Graças ao conselho de @sam, descobri que isso se deve a um plano de consulta ineficiente que é executado nesta linha:

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

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.

3 curtidas

Fechando como duplicata de:

@martin, você pode postar no tópico original lá assim que resolver.

4 curtidas