Condição de corrida no cron do GoodJob
TLDR: Corrige os erros de chave duplicada no agendamento de cron do GoodJob, causados por múltiplos processos competindo para inserir a mesma entrada.
Contexto
Os logs de produção mostram o erro a cada minuto:
ERROR: duplicate key value violates unique constraint "index_good_jobs_on_cron_key_and_cron_at_cond"
Key (cron_key, cron_at)=(update_therapist_available_times_by_last_profiles_changes, ...)
O Procfile define jobs: bundle exec good_job start --enable-cron. Quando o dyno jobs é reiniciado ou escalado, dois processos podem estar ativos simultaneamente — ambos com --enable-cron — e competem para inserir a mesma entrada de cron.
Alternativas consideradas: mover o cron para dentro do dyno web (execution mode async dentro do Puma), o que aumentaria a memória do web dyno; ou garantir que o dyno jobs nunca escale além de 1 instância.
A solução mais segura e simples é adicionar config.good_job.enable_cron = false no initializer, desabilitando o cron no modo programático. Assim somente o processo iniciado via CLI (--enable-cron no Procfile) gerencia o cron — e como o Heroku garante restart sequencial (não paralelo) do dyno jobs, a condição de corrida desaparece.
Objetivos
- Eliminar os erros de chave duplicada no cron do GoodJob que ocorrem a cada minuto
- Garantir que apenas um processo gerencie o agendamento das entradas de cron
Fora de escopo
— (não registrado na spec original)
Mudanças
config/initializers/good_job.rb: adicionarconfig.good_job.enable_cron = falsepara desabilitar o cron no modo programático — o cron só roda quando iniciado via--enable-cronna CLI (Procfile)
Como verificar
- Fazer o deploy e monitorar os logs por 5 minutos: não deve aparecer nenhum erro
duplicate key value violates unique constraint "index_good_jobs_on_cron_key_and_cron_at_cond" - Jobs agendados via cron continuam executando normalmente
Documentação
Nenhuma mudança de documentação necessária.