fix(serverust-events): evitar panic no backoff exponencial do EventRouter#13
Conversation
…uter O cálculo `base_delay * 2^exponent` usava `Duration * u32`, que em overflow dispara panic. Com `RetryPolicy::Exponential`, `base_delay` grande e muitas tentativas (expoente até 31), o produto pode exceder o máximo de `Duration` e derrubar o processo. Usa `Duration::saturating_mul` via helper e testes de regressão. Co-authored-by: Jaime Basso <JaimeJunr@users.noreply.github.com>
There was a problem hiding this comment.
Stale comment
Avaliação de risco (automação)
Nível: Baixo
Evidência (diff): Um ficheiro (
serverust-events/src/router.rs):exponential_backoff_delaycomsaturating_mulpara evitar panic por overflow no backoff; testes para saturação e valores pequenos. Sem infra, auth ou alterações alargadas de API.Revisão obrigatória por política Medium+: Não aplicável.
Aprovação automática: Não foi possível — a API do GitHub recusa aprovação neste contexto (
Review Can not approve your own pull request). Risco continua Baixo: um mantenedor pode aprovar/mergear após verificação habitual.Revisores adicionais: Não solicitados (já existe revisor atribuído; regra Low não exige fila extra).
Sent by Cursor Automation: Assign PR reviewers
|
Claude finished @cursor[bot]'s task —— View job Revisão do PR: fix(serverust-events): evitar panic no backoff exponencialTarefas:
Análise detalhadaCorreção implementada: Mudanças específicas:
Comentários inline📍 fn exponential_backoff_delay(base_delay: Duration, attempt_after_first: u32) -> Duration {
let exponent = attempt_after_first.min(31);
base_delay.saturating_mul(2u32.pow(exponent))
}✅ Boa implementação: Limitação do expoente a 31 é correta (2^32 causaria overflow em 📍 let delay = exponential_backoff_delay(*base_delay, attempt.saturating_sub(1));✅ Melhoria: O 📍 fn saturates_instead_of_panic_when_product_would_overflow_duration() {
let base = Duration::new(u64::MAX / 4, 0);
assert_eq!(
exponential_backoff_delay(base, 31),
Duration::MAX,
"produto base * 2^31 não cabe em Duration; deve saturar"
);
}✅ Teste crítico: Valida comportamento em cenário extremo que causaria o panic original. Verificação de invariantes CLAUDE.md✅ Sem impacto nas invariantes:
Segurança (OWASP)✅ Aspectos de segurança:
Cobertura de testes✅ Adequada mas básica:
Resumo final✅ Sem blockers - Aprovação recomendada Pontos positivos:
📋 Verificações finais recomendadas:
|
There was a problem hiding this comment.
Pull request overview
Corrige um caso de panic por overflow ao calcular o atraso do backoff exponencial no EventRouter (crate serverust-events), evitando encerramento abrupto do processo (ex.: Lambda/worker) em cenários de muitas falhas com base_delay alto.
Changes:
- Introduz helper
exponential_backoff_delayque calculabase * 2^nusandoDuration::saturating_mule limitando o expoente. - Atualiza
wrap_with_retrypara usar o helper na políticaRetryPolicy::Exponential. - Adiciona testes unitários cobrindo saturação em overflow e casos pequenos.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Avaliação de risco (automação)
Nível: Baixo
Evidência (diff): Apenas serverust-events/src/router.rs: função exponential_backoff_delay com expoente limitado a 31 e Duration::saturating_mul para evitar panic por overflow no produto base * 2^n; integração no loop de retry existente; testes unitários para saturação e casos pequenos. Sem infra, auth, billing ou mudanças amplas de superfície.
CODEOWNERS: Não aplicável (sem ficheiro no repositório).
Revisores: Não solicitados — política de Medium+ não se aplica.
Aprovação automática: A API do GitHub recusa (Review Can not approve your own pull request). O risco permanece Baixo; um mantenedor humano pode aprovar após verificação habitual.
Sent by Cursor Automation: Assign PR reviewers


Bug e impacto
Com
RetryPolicy::ExponentialemEventRouter::attach, o atraso entre tentativas erabase_delay * 2^exponent. Em Rust,Duration * u32panic quando o produto excede o máximo representável. Combase_delaygrande e expoente até 31 (após muitas falhas), o processo (Lambda/worker) podia ser encerrado de forma abrupta.Causa raiz
Uso de multiplicação não saturante de
std::time::Durationpor2u32.pow(exponent)emwrap_with_retry(serverust-events/src/router.rs).Correção e validação
exponential_backoff_delayusandoDuration::saturating_mul.Validação:
rustup run 1.91 cargo test -p serverust-eventserustup run 1.91 cargo clippy -p serverust-events -- -D warnings.