Skip to content

fix(serverust-events): liberar lock InProgress após falha do IdempotencyLayer - #25

Closed
cursor[bot] wants to merge 1 commit into
mainfrom
cursor/critical-bug-investigation-71ff
Closed

cursor[bot] wants to merge 1 commit into
mainfrom
cursor/critical-bug-investigation-71ff

Conversation

@cursor

@cursor cursor Bot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

Bug e impacto

Quando um handler SQS falhava com IdempotencyLayer ativo, o lock InProgress permanecia gravado pelo TTL (default 24 h). Na redelivery do SQS (visibility timeout de segundos/minutos), try_acquire retornava InProgress e o handler não era reexecutado — a mensagem podia ir para a DLQ da AWS sem processamento bem-sucedido.

Cenário concreto: handler transiente falha → lock InProgress 24 h → SQS redeliver em ~30 s → erro "already in progress" em loop até maxReceiveCount → DLQ sem sucesso.

Causa raiz

IdempotencyLayer chamava complete() apenas em sucesso do handler, mas não liberava o lock em falha (nem quando complete() falhava após sucesso).

Correção

  • Novo método IdempotencyStore::release (InMemory + DynamoDB).
  • IdempotencyLayer chama release após erro do handler ou falha ao gravar Completed.
  • Testes de regressão: redelivery SQS após falha transiente, release no store.

Validação

cargo test -p serverust-telemetry --test idempotency_lock
cargo test -p serverust-events --features sqs --test sqs_idempotency
cargo test -p serverust-events --features sqs --test sqs_tower

Todos passaram (21 testes).

Open in Web View Automation 

…ncyLayer

Após erro do handler, o lock permanecia InProgress pelo TTL (24h).
Redeliveries SQS recebiam InProgress e falhavam sem reexecutar o handler,
podendo enviar mensagens à DLQ sem processamento bem-sucedido.

Adiciona IdempotencyStore::release e chama no IdempotencyLayer em falhas
do handler ou do complete. Testes de regressão cobrem redelivery SQS.

Co-authored-by: Jaime Basso <JaimeJunr@users.noreply.github.com>
@JaimeJunr

Copy link
Copy Markdown
Owner

Fechado como duplicata. Os PRs #23, #24, #25 e #26 foram gerados de forma independente pelo scan semanal e corrigem exatamente o mesmo bug (lock InProgress não liberado após falha do handler no IdempotencyLayer).

O #24 foi escolhido como base por ser o único que combina as três propriedades desejáveis:

  • release remove apenas InProgress — não apaga registro Completed
  • DeleteItem condicional no DynamoDB (#state = :in_progress), tratando ConditionalCheckFailedException como sucesso
  • teste de regressão que exige duas execuções reais do handler, não só reacquisition do lock

O teste de falha de complete() do #23 foi portado para o #24. Nada mais desta branch se perde.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants