Nas últimas ~18h, nosso servidor está usando perto de 100% de CPU.
Olhando o Sidekiq, ele está ocupado executando os mesmos 5 jobs:
Eles estão sempre em “Agora mesmo” e parecem estar sempre reexecutando sobre esses mesmos 3 IDs de tópico.
Tentei reiniciar o Discourse, mas a situação permaneceu.
Não tenho certeza se está relacionado, mas isso começou ~24h depois que atualizamos de 3.3.3 para 3.3.4. Não vejo nenhuma alteração recente em app/jobs/regular/sync_topic_user_bookmarked.rb e não consegui identificar nenhuma alteração em 3.3.4 que pudesse estar relacionada, mas não conheço o código.
Alguma ideia sobre o que pode estar acontecendo?
Uma atualização sobre isso. Acabamos de notar que os 3 IDs de tópico sobre os quais as tarefas continuam sendo executadas são tópicos aos quais ativamos a exclusão automática de respostas ontem, perto de quando isso começou. São todos tópicos muito grandes.
Portanto, sabemos o gatilho, mas o SQL que está sendo repetido não parece estar fazendo nenhum processamento em lote, então não vejo por que ele está sendo executado repetidamente.
Isso está sendo acionado por algum outro job que ainda está excluindo o grande número de respostas e Jobs::SyncTopicUserBookmarked é executado para cada postagem excluída? Ou isso é um bug?
Removemos a exclusão automática de um dos tópicos grandes e isso não pareceu ter efeito nas chamadas repetidas de Jobs::SyncTopicUserBookmarked sobre esse ID de tópico.
Eu reduzi SIDEKIQ_WORKERS para 2 e, pouco tempo depois, a fila (com muitas coisas pendentes) foi limpa e não há mais Jobs::SyncTopicUserBookmarked em execução… 
Antes de tentar isso, percebi a consulta abaixo sendo executada várias vezes ao mesmo tempo (usando o mesmo ID de tópico):
SELECT bookmarks.user_id, COUNT(*)
INTO TEMP TABLE tmp_sync_topic_user_bookmarks
FROM bookmarks
LEFT JOIN posts ON posts.id = bookmarks.bookmarkable_id AND bookmarks.bookmarkable_type = 'Post'
LEFT JOIN topics ON (topics.id = bookmarks.bookmarkable_id AND bookmarks.bookmarkable_type = 'Topic') OR
(topics.id = posts.topic_id)
WHERE (topics.id = 51303 OR posts.topic_id = 51303)
AND posts.deleted_at IS NULL AND topics.deleted_at IS NULL
GROUP BY bookmarks.user_id;
UPDATE topic_users
SET bookmarked = true
FROM tmp_sync_topic_user_bookmarks
WHERE topic_users.user_id = tmp_sync_topic_user_bookmarks.user_id AND
topic_users.topic_id = 51303 AND
tmp_sync_topic_user_bookmarks.count > 0;
UPDATE topic_users
SET bookmarked = false
FROM tmp_sync_topic_user_bookmarks
WHERE topic_users.topic_id = 51303 AND
topic_users.bookmarked = true AND
topic_users.user_id NOT IN (
SELECT tmp_sync_topic_user_bookmarks.user_id
FROM tmp_sync_topic_user_bookmarks
);
DROP TABLE tmp_sync_topic_user_bookmarks;
Não está claro para mim como o PostgreSQL executa várias instruções em uma única consulta, mas se ela for executada várias vezes simultaneamente, isso poderia causar um loop de alguma forma?