Segnalibro di un post su un argomento di grandi dimensioni crea tempi di caricamento assurdi

In particolare, questo argomento mi stava dando fastidio da molto tempo. Mi chiedevo: perché ci vogliono da 1 a 3 minuti per caricarlo, se mai decide di caricarsi?

Dopo aver visto qualcuno confermare lo stesso problema in questo post, ho deciso di indagare: ho rimosso tutti i segnalibri dal thread con 4.500 post.

Si è caricato istantaneamente, come qualsiasi altro post.

Mi sono poi chiesto: in quali altri modi potrei testare questa ipotesi?

  • Indipendentemente dal fatto che avessi segnato il primo o l’ultimo post, il caricamento richiedeva comunque del tempo, anche se non minuti bensì circa 10 secondi.
  • L’effetto si aggravava nei thread con più post; ho l’impressione che esista una certa soglia intorno ai 4000 post che rende i tempi di caricamento così lenti.
  • Ho testato questa ipotesi su altri thread con oltre 4000 post.
  • Più segnalibri ha un argomento, più tempo impiega a caricarsi.

La mia teoria è che più segnalibri hai su un argomento con molti post, più tempo impiega a caricarsi.


Per riprodurre il problema: apri un argomento con moltissimi post e aggiungi un segnalibro. Peccato che per segnare un post nel thread di riferimento sia necessario accedere, e che il thread con il maggior numero di risposte su questo sito abbia solo 925 commenti.

Se hai bisogno di ulteriori informazioni, chiedi pure.

4 Mi Piace

Sono quasi sicuro di averlo già segnalato a te, @martin, in un altro argomento

2 Mi Piace

Sì, hai ragione, in questo: Topics load slow or not at all when they have many replies and user has bookmark in them. Scusa, sembra che abbia trascurato questo caso; sposterò questa problematica in cima alla mia lista.

2 Mi Piace

Anche questo è abbastanza grave da dover essere retroportato, se esiste nella versione stabile.

3 Mi Piace

Ho creato un account sul forum di Roblox per esaminare What are you working on currently? (2020) - #5043 by FLYSLENDY04 - Creations Feedback - Developer Forum | Roblox e sono riuscito a riprodurre il problema lì. Senza un segnalibro, l’argomento si carica in circa 1,3 secondi; con un segnalibro, invece, ci vogliono circa 8 secondi. Ho anche riscontrato un errore 502 Bad Gateway:

Tuttavia, ho creato un argomento con 5000 post in locale e ho aggiunto un segnalibro: il tempo di caricamento è lo stesso, sia che ci sia un segnalibro nell’argomento o meno :man_shrugging:. Dovrò continuare a cercare… Il codice che carica i segnalibri di un utente in un argomento è qui:

E il codice che cerca un segnalibro per ogni post è qui:

A mio avviso, questo non sembra né folle né ad alta intensità di risorse. user_post_bookmarks interroga il database solo una volta perché è memorizzato nella cache, quindi non c’è problema N+1. Inoltre, ecco il codice della visualizzazione dell’argomento per verificare se esiste un segnalibro a livello di argomento:

Niente di sospetto nemmeno qui…

2 Mi Piace

Potrebbe essere un bug che abbiamo già corretto in una versione precedente? :thinking:

2 Mi Piace

Non credo proprio, il forum di Roblox è sulla versione Version bump to v2.6.0.beta3 · discourse/discourse@2a268bd · GitHub. Da allora ci sono stati solo due commit relativi ai segnalibri che ho fatto io, nessuno dei quali riguarda il caricamento o la serializzazione dei segnalibri degli argomenti.

Forse c’è qualche altra strana coincidenza in gioco, suppongo?

1 Mi Piace

Posso riprodurre questo problema su BBS

C’è qualcosa che non va in quella query che sta confondendo il planner. Prova a esaminare il piano di esecuzione e a modificarlo leggermente.

Il mio sospetto è che alcune modifiche molto molto piccole possano ridurre il tempo da quasi 4 secondi a 1 millisecondo.

Nota per tutti i lettori: avere il mini profiler abilitato è fondamentale qui; può aiutarti a individuare la query problematica.

5 Mi Piace

Grazie al consiglio di @sam, ho scoperto che ciò è dovuto a un piano di query inefficiente che viene eseguito in questa riga:

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

L’SQL generato contiene un LIMIT 1, il che fa sì che l’indice index_posts_on_topic_id_and_post_number non venga mai utilizzato, causando un enorme ritardo. Non riesco a riprodurre il problema localmente perché ho pochissimi post nel database locale; fondamentalmente, più post ci sono nell’intero forum Discourse, più grave diventa questo problema. Stavo per fornire una soluzione a breve.

3 Mi Piace

Chiudo come duplicato di:

@martin, puoi rispondere al topic originale lì una volta risolto.

4 Mi Piace