Não é possível "Excluir todas as postagens" quando existem postagens que pertencem a um megatópico

Estou enfrentando um problema na minha comunidade. Não consigo “excluir todas as postagens” de certos usuários. Pelo que pude perceber, isso está acontecendo apenas com contas mais antigas que têm muitas postagens. Contas mais recentes não enfrentam esse problema.

Verifiquei as configurações do site e aumentei o limite para “excluir todas as postagens” para 10.000.

Atualmente, estou tentando excluir um usuário com cerca de 900 postagens. O usuário não deseja ser anonimizado e está ameaçando tomar medidas legais se a conta e as postagens não forem removidas. Pressiono o botão “excluir todas” e, após cerca de um minuto, recebo esta mensagem:

Vejo isso no console do meu navegador, erro 502 na postagem:
image

Verifiquei os logs do meu servidor e vi o seguinte aparecer após tentar excluir:

TypeError: undefined is not an object (evaluating ‘s.users’)
Url: https://myserver.com/assets/ember_jquery-d430881a3fb1403871256e5a02423c4b20a78793685e92088613ca9a701baf88.js
Linha: 9
Coluna: 8994
Localização da Janela: https://myserver/t/topic/64828/2502

Existe algum lugar onde eu possa procurar para encontrar a origem do problema? Logs?

1 curtida

Tente ir em Admin / Logs / Logs de Erro. Em seguida, tente excluir as postagens novamente. Espera-se que haja uma entrada no log para a postagem que está causando o problema.

4 curtidas

Este é o erro que aparece no log depois que tento excluir todas as postagens:

TypeError: undefined is not an object (evaluating 's.users')
Url: https://myserver.com/assets/ember_jquery-d430881a3fb1403871256e5a02423c4b20a78793685e92088613ca9a701baf88.js
Linha: 9
Coluna: 8994
Local da janela: https://myserver.com/t/topic/64828/2502
1 curtida

Estou percebendo que ele exclui algumas postagens (cerca de 5) antes de aparecer a caixa de diálogo de erro. Não sei se isso é relevante.

Certo, eu deveria ter lido sua postagem com mais atenção.

Parece que está falhando para o tópico com o id 64828. O usuário criou postagens neste tópico?

Peço desculpas, ao examinar mais de perto, esse erro parece estar relacionado a outra coisa.
Estou vendo este agora e suspeito que possa ser devido a um tempo esgotado na solicitação:

image

Também tentei fazer a exclusão por meio de uma solicitação de API, mas acho que seria a mesma coisa que na interface.

Escrevi um pequeno aplicativo que chama a API do Discourse na minha instalação. Ele exclui cada postagem individualmente, em vez de fazer um lote. Então, para 700 postagens, seriam feitas 700 chamadas à API. Não é o mais eficiente, mas foi útil.

Vejo que há 20 postagens problemáticas. Parece que a função “excluir tudo” para ao encontrar uma delas e não consegue excluí-las. A API não conseguiu excluí-las por algum motivo. Agora, excluí manualmente a maioria delas acessando a postagem e clicando no botão de excluir, como um moderador faria normalmente.

Ainda restam cerca de 5 que não consigo excluir, nem via API nem normalmente. Não vejo nenhuma semelhança entre elas. Algumas estão em tópicos enormes, outras em tópicos pequenos. Algumas são respostas, têm curtidas, têm imagens, outras não. Quando tento excluí-las pela interface padrão, recebo esta caixa de erro:

Alguns dos meus usuários relataram receber a mesma caixa de erro ao tentar excluir suas próprias postagens. Eu assumi que fosse devido a um problema de conexão ou algo assim, já que quase todos estão usando dispositivos móveis, mas pode ser algo diferente.

Ao tentar excluir manualmente, recebo este log:
23

Alguma ideia ou sugestão?

As cinco postagens problemáticas estão todas dentro de dois tópicos grandes. Fechamos ambos recentemente porque estavam ficando muito grandes. Um tópico tem 55 mil postagens e o outro tem 17 mil. Estou supondo que haja muito processamento envolvido quando uma postagem dentro de um tópico tão grande é removida, o que estaria causando algum tipo de tempo limite, mas isso é apenas uma suposição.

1 curtida

Agora estou travado. Não consigo excluir as postagens nesses tópicos grandes e também não consigo excluir os tópicos. Ambos os casos resultam na janela de erro 502 do gateway.

:scream:

Você já tentou excluir esses 5 posts usando o console?

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

Sim! Isso resolve. Eu não sei nada de Ruby ou Rails, mas consigo encadear alguns posts em um único comando assim:

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

Provavelmente usarei isso em algum momento quando alguns posts ficarem travados. É possível (e seguro) excluir um tópico dessa forma também?

Geralmente, as postagens no Discourse são apenas ‘soft-deleted’ (excluídas logicamente) e não ‘hard-deleted’ (excluídas fisicamente). Com o comando destroy, você as removeu diretamente do banco de dados. Usei esse comando apenas porque as postagens que você tentava excluir pertenciam a tópicos extremamente longos.

Não recomendo o uso desse método, nem para postagens nem para tópicos. Eles não podem ser recuperados e, pelo que entendi, você está trabalhando em um banco de dados de um site em produção, o que traz o risco de quebrar todo o site caso algo dê errado. No entanto, se você deseja usar o comando destroy, fique à vontade. Você deve sempre fazer um backup se planeja usar esse tipo de comando.

Para excluir permanentemente um tópico, execute:

Topic.find(THE_TOPIC_ID).destroy
1 curtida

Apenas uma nota para dizer que, para evitar esse tipo de problema de desempenho :arrow_up:, também introduzimos algumas configurações para evitar a criação de megatópicos. Veja The MEGATOPIC: public good, or public menace? para detalhes.

2 curtidas

Obrigado pelo conselho. É exatamente o que eu esperava, e vou usar o comando destroy apenas como último recurso.

Como normalmente é um soft delete dos posts, parece que ele escreve várias outras coisas em vez de apenas excluir o registro. Será que é por isso que não funciona bem ao excluir os posts de um mega tópico? Talvez sejam muitas coisas para fazer e ele atinja o tempo limite?

Adoraria uma forma de resolver isso sem precisar recorrer ao comando de console arriscado.

Obrigado. Alterei nosso limite máximo de tópicos para 2500. Há algum tempo, os usuários pediram que o limite fosse removido, o que levou à criação desses tópicos gigantes. No entanto, esses tópicos gigantes não são bons para o fórum. O desempenho do servidor foi severamente impactado durante os horários de pico, quando muitas pessoas estavam respondendo a eles. Acabamos fechando-os para evitar que isso continuasse acontecendo, mas agora ainda estamos presos a esses tópicos massivos que estão causando outros problemas.

A solução mais simples é que alguns moderadores se ponham a trabalhar e comecem a dividir (e depois fechar) megatópicos em vários tópicos, por exemplo:

  • :lock:[Título do Megatópico] parte 1
  • :lock:[Título do Megatópico] parte 2
  • :lock:[Título do Megatópico] parte 3
  • :lock:[Título do Megatópico] parte […]
  • :unlock:[Título do Megatópico] parte 10

Cada parte será automaticamente vinculada à anterior e à seguinte, para que os usuários não tenham dificuldades de navegação e, com certeza, o problema de desempenho será resolvido.

Sim, será um trabalho chato de fazer, mas essa é também uma das razões pelas quais ter um tópico com 55 mil ou 17 mil mensagens é absolutamente inútil, já que ninguém vai lê-las.

4 curtidas

Agora temos um recurso (configuração do site) exatamente para esse caso de uso!

4 curtidas