Erro de retentativa no sidekiq

Esta é a primeira vez que vejo este erro após a atualização recente para 2.9.0beta4

Jobs::UserEmail

{“type”=>“user_watching_first_post”, “user_id”=>1735, “notification_id”=>33246, “notification_data_hash”=>{“topic_title”=>“Some new notes”, “original_post_id”=>11592, “original_post_type”=>1, “original_username”=>“xfactor”, “revision_number”=>nil, “display_username”=>“xfactor”}, “notification_type”=>“watching_first_post”, “post_id”=>11592, “current_site_id”=>“default”}

Jobs::HandledExceptionWrapper: Wrapped ActiveRecord::RecordInvalid: Validation failed: Post has already been taken

Se eu tentar novamente, falha novamente. Isso parece ser em referência a um novo tópico que foi criado por um usuário.

O que isso significa e como eu conserto isso?

2 curtidas

Estou vendo que o servidor enviou vários e-mails com sucesso para este novo tópico para todos que estavam acompanhando essa categoria, não estou vendo nenhum erro nos logs de e-mail ou no servidor de e-mail.

Então, a que isso se refere?

Mesmo erro pela primeira vez aqui, tentar novamente não ajuda, todos os outros e-mails foram entregues:

Jobs::UserEmail

{"type"=>"user_private_message", "user_id"=>1513, "notification_id"=>871360, "notification_data_hash"=>{"topic_title"=>"Título do Tópico", "original_post_id"=>220174, "original_post_type"=>1, "original_username"=>"username", "revision_number"=>nil, "display_username"=>"user", "group_name"=>nil}, "notification_type"=>"private_message", "post_id"=>220174, "current_site_id"=>"default"}

Jobs::HandledExceptionWrapper: Wrapped ActiveRecord::RecordInvalid: Falha na validação: O post já foi levado

Backtrace

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.7/lib/active_record/validations.rb:80:in `raise_validation_error'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.7/lib/active_record/validations.rb:53:in `save!'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.7/lib/active_record/transactions.rb:302:in `block in save!'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.7/lib/active_record/transactions.rb:354:in `block in with_transaction_returning_status'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.7/lib/active_record/connection_adapters/abstract/database_statements.rb:318:in `transaction'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.7/lib/active_record/transactions.rb:350:in `with_transaction_returning_status'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.7/lib/active_record/transactions.rb:302:in `save!'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.7/lib/active_record/suppressor.rb:48:in `save!'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.7/lib/active_record/persistence.rb:55:in `create!'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.7/lib/active_record/relation.rb:799:in `_create!'

Também notei os logs do discourse:

Message (21 copies reported)

Job exception: Validation failed: Post has already been taken


Backtrace

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.7/lib/active_record/validations.rb:80:in `raise_validation_error'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.7/lib/active_record/validations.rb:53:in `save!'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.7/lib/active_record/transactions.rb:302:in `block in save!'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.7/lib/active_record/transactions.rb:354:in `block in with_transaction_returning_status'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.7/lib/active_record/connection_adapters/abstract/database_statements.rb:318:in `transaction'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.7/lib/active_record/transactions.rb:350:in `with_transaction_returning_status'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.7/lib/active_record/transactions.rb:302:in `save!'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.7/lib/active_record/suppressor.rb:48:in `save!'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.7/lib/active_record/persistence.rb:55:in `create!'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.7/lib/active_record/relation.rb:799:in `_create!'

Movendo isto para bugs em vez de suporte

1 curtida

Oi @RBoy :slight_smile:

Você ainda está vendo este erro?

Para essa entrada, sim, ela ainda estava presa em um loop de retentativas até ontem, quando, após centenas de retentativas, eu finalmente me cansei e a deletei. Espero não ter quebrado nada.

Não a vi novamente, mas também não houve um evento que disparasse centenas de e-mails em uma única postagem. Seria bom, no entanto, entender de onde isso veio e o que significa.

Há alguns dias, vi esse erro em três mensagens, e elas não eram críticas, então excluí os trabalhos depois que uma nova tentativa não foi bem-sucedida.

Agora tenho 2001 delas, e minha conta de teste não recebeu um resumo semanal que deveria ter recebido.

Executando 8695449cfc agora.

2 curtidas

Atualizei para bf987af3ca e tentei tudo novamente, mas ainda tenho pelo menos 38 de Jobs::HandledExceptionWrapper: Wrapped ActiveRecord::RecordInvalid: Validation failed: Post has already been taken aparecendo no meu console sidekiq.

2 curtidas

Sem mais atualizações, agora estou com 30. Eu suspeito que eles estão falhando por timeout, exceto que minha conta de teste recebeu o resumo semanal (atrasado), e presumo que isso esteja relacionado. Não tenho certeza de onde procurar nos logs para saber se algum deles está realmente desistindo.

Eles parecem falhar na maioria das vezes, mas ocasionalmente funcionam, o que definitivamente cheira a uma condição de corrida em algum lugar.

Meus backtraces parecem os mesmos que @RBoy e @md-misko viram, mas aqui está o backtrace completo, não apenas o truncado do botão "Copiar":

activerecord-7.0.3/lib/active_record/validations.rb:80:in `raise_validation_error'
activerecord-7.0.3/lib/active_record/validations.rb:53:in `save!'
activerecord-7.0.3/lib/active_record/transactions.rb:302:in `block in save!'
activerecord-7.0.3/lib/active_record/transactions.rb:354:in `block in with_transaction_returning_status'
activerecord-7.0.3/lib/active_record/connection_adapters/abstract/database_statements.rb:314:in `transaction'
activerecord-7.0.3/lib/active_record/transactions.rb:350:in `with_transaction_returning_status'
activerecord-7.0.3/lib/active_record/transactions.rb:302:in `save!'
activerecord-7.0.3/lib/active_record/suppressor.rb:54:in `save!'
activerecord-7.0.3/lib/active_record/persistence.rb:55:in `create!'
activerecord-7.0.3/lib/active_record/relation.rb:869:in `_create!'
activerecord-7.0.3/lib/active_record/relation.rb:115:in `block in create!'
activerecord-7.0.3/lib/active_record/relation.rb:880:in `_scoping'
activerecord-7.0.3/lib/active_record/relation.rb:428:in `scoping'
activerecord-7.0.3/lib/active_record/relation.rb:115:in `create!'
activerecord-7.0.3/lib/active_record/relation.rb:219:in `block in create_or_find_by!'
activerecord-7.0.3/lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction'
activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
activerecord-7.0.3/lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction'
activerecord-7.0.3/lib/active_record/connection_adapters/abstract/database_statements.rb:316:in `transaction'
activerecord-7.0.3/lib/active_record/transactions.rb:209:in `transaction'
activerecord-7.0.3/lib/active_record/relation/delegation.rb:67:in `block in transaction'
activerecord-7.0.3/lib/active_record/relation.rb:880:in `_scoping'
activerecord-7.0.3/lib/active_record/relation.rb:428:in `scoping'
activerecord-7.0.3/lib/active_record/relation/delegation.rb:67:in `transaction'
activerecord-7.0.3/lib/active_record/relation.rb:219:in `create_or_find_by!'
activerecord-7.0.3/lib/active_record/querying.rb:22:in `create_or_find_by!'
/var/www/discourse/lib/email/sender.rb:498:in `get_reply_key'
/var/www/discourse/lib/email/sender.rb:105:in `send'
/var/www/discourse/app/jobs/regular/user_email.rb:83:in `send_user_email'
/var/www/discourse/app/jobs/regular/user_email.rb:38:in `execute'
/var/www/discourse/app/jobs/base.rb:232:in `block (2 levels) in perform'
/var/www/discourse/lib/rails_multisite/connection_management.rb:80:in `with_connection'
/var/www/discourse/app/jobs/base.rb:221:in `block in perform'
/var/www/discourse/app/jobs/base.rb:217:in `each'
/var/www/discourse/app/jobs/base.rb:217:in `perform'
sidekiq-6.4.2/lib/sidekiq/processor.rb:196:in `execute_job'
sidekiq-6.4.2/lib/sidekiq/processor.rb:164:in `block (2 levels) in process'
sidekiq-6.4.2/lib/sidekiq/middleware/chain.rb:138:in `block in invoke'
/var/www/discourse/lib/sidekiq/pausable.rb:138:in `call'
sidekiq-6.4.2/lib/sidekiq/middleware/chain.rb:140:in `block in invoke'
sidekiq-6.4.2/lib/sidekiq/middleware/chain.rb:143:in `invoke'
sidekiq-6.4.2/lib/sidekiq/processor.rb:163:in `block in process'
sidekiq-6.4.2/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch'
sidekiq-6.4.2/lib/sidekiq/job_retry.rb:114:in `local'
sidekiq-6.4.2/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch'
sidekiq-6.4.2/lib/sidekiq.rb:40:in `block in <module:Sidekiq>'
sidekiq-6.4.2/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch'
sidekiq-6.4.2/lib/sidekiq/processor.rb:257:in `stats'
sidekiq-6.4.2/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch'
sidekiq-6.4.2/lib/sidekiq/job_logger.rb:13:in `call'
sidekiq-6.4.2/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch'
sidekiq-6.4.2/lib/sidekiq/job_retry.rb:81:in `global'
sidekiq-6.4.2/lib/sidekiq/processor.rb:124:in `block in dispatch'
sidekiq-6.4.2/lib/sidekiq/job_logger.rb:39:in `prepare'
sidekiq-6.4.2/lib/sidekiq/processor.rb:123:in `dispatch'
sidekiq-6.4.2/lib/sidekiq/processor.rb:162:in `process'
sidekiq-6.4.2/lib/sidekiq/processor.rb:78:in `process_one'
sidekiq-6.4.2/lib/sidekiq/processor.rb:68:in `run'
sidekiq-6.4.2/lib/sidekiq/util.rb:56:in `watchdog'
sidekiq-6.4.2/lib/sidekiq/util.rb:65:in `block in safe_thread'

Há alguma outra informação que eu possa fornecer para ajudar a depurar isso?

4 curtidas

3 posts were merged into an existing topic: Email Hostname Certificate Mismatch Causing sidekiq Queue Overload, Severe Site Instability

Também estou tendo esse problema!

Descobri que meu servidor de e-mail estava usando um certificado para outro servidor em seu round-robin e esperava que a incompatibilidade de nome de host fosse o problema. Atualizei para b850c12793 no processo de mudança para um servidor que não tinha incompatibilidade de certificado, mas isso não resolveu o problema. Tentei novamente alguns dos trabalhos, mas nenhum deles foi concluído com sucesso. Portanto, este bug não é um sintoma de incompatibilidades de certificado ocultas.

Isso foi construído com discourse_docker 2a9faf7e5680b9.

Atualizar o discourse_docker para 241a42ce718, e com ele o discourse para 95e7e10417, também não resolveu o problema. Ainda tenho 30 dessas falhas sendo retentadas.

1 curtida

Pelo que você está descrevendo e olhando este post, pode haver vários problemas aqui:

O servidor pode não estar limitando suas tentativas de reenvio de e-mails, fazendo com que ele expire ou seja rejeitado pelo servidor de e-mail. Mas há algum outro problema subjacente se seus certificados e configuração forem válidos e ele ainda não estiver enviando os e-mails. Para alguns, também parece estar consumindo espaço em disco. Verifiquei o meu, mas não notei isso aqui.

Eu não fiquei sem espaço, e isso acontece mesmo quando seleciono exatamente um trabalho para reexecutar, então não parece uma condição de corrida. Claramente há mais de um problema aqui, e o que estou vendo aqui não está relacionado a esse tópico vinculado.

(Acontece que eu não tinha um problema de certificado, afinal; os nomes dos servidores estavam no nome alternativo do servidor. Mas eu mudei para usar o nome do host que corresponde ao SN de qualquer maneira, e não fez diferença.)

Estou enviando com sucesso um número tremendo de e-mails, apenas esses poucos trabalhos estão travados. Eu não sei, por exemplo, que entradas de log procurar para ajudar no diagnóstico.

2 curtidas

Criei um rascunho de PR por enquanto que adiciona um teste com falha que replica este problema:

Agora que sabemos qual linha de código está causando o problema, espero que possamos encontrar uma boa solução em breve.

5 curtidas

Revisei meus 29 e-mails com falha para garantir que não havia nada crítico para enviar e, pelo que pude apurar, não havia. Portanto, excluí todos os trabalhos no sidekiq, caso isso se devesse a um problema transitório devido a trabalhos de e-mail que abrangiam atualizações. No entanto, sem aplicar mais atualizações, agora tenho outro caso isolado da mesma falha.

Estou apenas compartilhando isso como informação de que é um problema em andamento e não algo transitório incomum.

2 curtidas

A correção do código acima foi mesclada, você pode fazer git pull das últimas alterações e reconstruir seu contêiner quando tiver uma chance?

4 curtidas

A atualização e a nova tentativa do trabalho foram bem-sucedidas no envio do e-mail; verifiquei os logs de e-mail e foi relatado como enviado.

Obrigado!

4 curtidas