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: adicionar config.good_job.enable_cron = false para desabilitar o cron no modo programático — o cron só roda quando iniciado via --enable-cron na 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.