Impossibile "Eliminare tutti i post" quando esistono post appartenenti a un megatopic

Sto riscontrando un problema nella mia community. Non riesco a “eliminare tutti i post” di alcuni utenti. Per quanto posso vedere, il problema si verifica solo con account più vecchi che hanno molti post. Gli account più recenti non hanno questo problema.

Ho controllato le impostazioni del sito e ho aumentato il limite per l’eliminazione di tutti i post a 10.000.

Attualmente sto cercando di eliminare un utente con circa 900 post. L’utente non vuole essere anonimizzato e minaccia azioni legali se l’account e i post non verranno rimossi. Premo il pulsante “elimina tutti” e dopo circa un minuto ricevo questo messaggio:

Nel console del browser vedo questo errore 502 sul post:
image

Ho controllato i log sul mio server e dopo il tentativo di eliminazione appare questo messaggio:

TypeError: undefined is not an object (evaluating ‘s.users’)
Url: https://myserver.com/assets/ember_jquery-d430881a3fb1403871256e5a02423c4b20a78793685e92088613ca9a701baf88.js
Line: 9
Column: 8994
Window Location: https://myserver/t/topic/64828/2502

C’è qualche altro posto dove posso cercare per trovare la causa del problema? Log?

1 Mi Piace

Prova ad andare su Amministrazione / Log / Log degli errori. Quindi riprova a eliminare i post. Speriamo che ci sia una voce nel log per il post che sta causando il problema.

4 Mi Piace

Questo è l’errore che appare nel log dopo aver provato a eliminare tutti i post:

TypeError: undefined is not an object (evaluating 's.users')
Url: https://myserver.com/assets/ember_jquery-d430881a3fb1403871256e5a02423c4b20a78793685e92088613ca9a701baf88.js
Line: 9
Column: 8994
Window Location: https://myserver.com/t/topic/64828/2502
1 Mi Piace

Ho notato che vengono cancellati alcuni post (circa 5) prima che appaia la finestra di dialogo dell’errore. Non so se questo sia rilevante.

Giusto, avrei dovuto leggere il tuo post più attentamente.

Sembra che fallisca per il topic con l’ID 64828. L’utente ha creato dei post in questo topic?

Scusate, dopo un’analisi più attenta, sembra che quell’errore sia legato a qualcos’altro.
Ora vedo questo e sospetto che possa essere dovuto a un timeout della richiesta:

image

Ho anche provato a eseguire l’eliminazione tramite una richiesta API, ma immagino che sarebbe la stessa cosa dell’interfaccia utente.

Ho scritto una piccola app che chiama l’API di Discourse sulla mia installazione. Elimina ogni singolo post individualmente, invece di farlo in batch. Quindi, per 700 post, effettua 700 chiamate API. Non è il metodo più efficiente, ma mi è stato utile.

Vedo che ci sono 20 post problematici. Sembra che la funzione “elimina tutto” si fermi non appena incontra uno di questi e non riesca a eliminarli. L’API non è riuscita a eliminarli per qualche motivo. Ora li ho eliminati manualmente la maggior parte, entrando nel post e premendo il pulsante elimina come farebbe normalmente un moderatore.

Rimangono ancora circa 5 che non riesco a eliminare, né tramite API né in modo normale. Non vedo alcuna somiglianza tra di loro. Alcuni si trovano in discussioni molto lunghe, altri in discussioni brevi. Alcuni sono risposte, hanno like, hanno immagini, altri no. Quando provo a eliminarli tramite l’interfaccia utente standard, appare questa finestra di errore:

Alcuni dei miei utenti hanno segnalato di ricevere la stessa finestra quando provano a eliminare i propri post. Ho ipotizzato che fosse dovuto a un problema di connessione o simile, dato che quasi tutti sono su mobile, ma potrebbe trattarsi di qualcos’altro.

Quando provo a eliminarli manualmente, ottengo questo log:
23

Qualche idea o suggerimento?

I cinque post problematici rientrano tutti in due grandi argomenti. Li abbiamo chiusi di recente perché stavano diventando troppo grandi. Uno dei due argomenti conta 55.000 post, l’altro 17.000. Immagino che ci sia molta elaborazione da fare quando un post all’interno di un argomento così vasto viene rimosso, e che questo causi un timeout di qualche tipo, ma è solo un’ipotesi.

1 Mi Piace

Ora sono bloccato. Non riesco a eliminare i post in quei topic lunghi e non riesco a eliminare i topic. Entrambe le operazioni si concludono con la finestra di dialogo 502 gateway.

:scream:

Hai provato a eliminare questi 5 messaggi usando la console?

./launcher enter app
rails c
Post.find(THE_POST_ID).destroy
2 Mi Piace

Sì! Funziona alla perfezione. Non conosco affatto Ruby o Rails, ma riesco a concatenare alcuni post in un unico comando in questo modo:

Post.find(POST1_ID).destroy; Post.find(POST2_ID).destroy

Probabilmente lo userò in futuro quando alcuni post rimarranno bloccati. È possibile (e sicuro) eliminare anche un argomento in questo modo?

In genere, i post su Discourse vengono solo soft-deleted e non hard-deleted. Con il comando destroy li hai semplicemente eliminati dal database, e ti ho consigliato di usarlo solo perché i post che stavi cercando di eliminare appartenevano a topic incredibilmente lunghi.

Non consiglio di utilizzare questo metodo né per i post né per i topic. Non potranno mai essere ripristinati e, da quanto ho capito, stai lavorando su un database di un sito in produzione, con il rischio di rompere l’intero sito se qualcosa va storto. Tuttavia, se desideri utilizzare il comando destroy, sei libero di farlo. Dovresti sempre eseguire un backup se intendi usare questo tipo di comandi.

Per eliminare permanentemente un topic, esegui

Topic.find(ID_DEL_TOPIC).destroy
1 Mi Piace

Solo una nota per dire che, per evitare questo tipo di problemi di prestazioni :arrow_up:, abbiamo anche introdotto alcune impostazioni per evitare la creazione di megatopic. Per i dettagli, vedi The MEGATOPIC: public good, or public menace?

2 Mi Piace

Grazie per il consiglio. È esattamente ciò che mi aspettavo e userò il comando destroy solo come ultima risorsa.

Dato che normalmente le pubblicazioni vengono eliminate in modo soft, sembra che vengano scritti molti altri elementi invece di cancellare semplicemente il record. Forse è per questo che non funziona bene quando si eliminano le pubblicazioni da un mega argomento? Forse ci sono troppe operazioni da eseguire e si verifica un timeout?

Mi piacerebbe trovare un modo per risolvere il problema senza dover ricorrere al comando della console, che è rischioso.

Grazie. Ho modificato il limite massimo di argomenti a 2500. Gli utenti avevano chiesto di rimuovere il limite qualche tempo fa, il che ha portato alla creazione di questi argomenti enormi. Tuttavia, gli argomenti enormi non sono adatti al forum. Le prestazioni del server erano fortemente compromesse durante i periodi di punta, quando molte persone rispondevano ad essi. Abbiamo finito per chiuderli per evitare che ciò accadesse, ma ora siamo ancora bloccati con questi argomenti massicci che causano altri problemi.

La soluzione più semplice è che alcuni moderatori si mettano al lavoro e inizino a dividere (e poi chiudere) i megatemi in più argomenti, ad esempio:

  • :lock:[Titolo del megatema] parte 1
  • :lock:[Titolo del megatema] parte 2
  • :lock:[Titolo del megatema] parte 3
  • :lock:[Titolo del megatema] parte […]
  • :unlock:[Titolo del megatema] parte 10

Ogni parte sarà collegata automaticamente alla precedente e alla successiva, quindi gli utenti non dovrebbero incontrare difficoltà di navigazione e il problema delle prestazioni dovrebbe essere risolto definitivamente.

Sì, sarà un lavoro noioso da fare, ma questo è anche uno dei motivi per cui avere un argomento con 55.000 o 17.000 messaggi è assolutamente inutile, dato che nessuno li leggerà.

4 Mi Piace

Ora abbiamo una funzionalità (impostazione del sito) proprio per questo caso d’uso!

4 Mi Piace