fix: prevent Voice XP checkpoint write conflicts #33

Merged
isyuricunha merged 7 commits from fix/voice-xp-write-conflicts into main 2026-08-27 17:10:34 +00:00
isyuricunha commented 2026-08-27 17:00:58 +00:00 (Migrated from github.com)

Problema

O Voice XP podia processar a mesma sessão simultaneamente pelo flush periódico e por eventos de voz (saída, mute/deaf ou retorno). As transações Serializable protegiam a consistência, mas o PostgreSQL precisava abortar/repetir transações concorrentes, gerando P2034/write-conflict no log e trabalho desnecessário.

Correção

  • serializa operações de sessão por guildId:userId dentro do processo;
  • aplica a mesma serialização a início, checkpoint, encerramento e limpeza de sessão inativa;
  • revalida o estado de voz antes de remover uma sessão considerada inativa, evitando apagar uma sessão que acabou de voltar a ficar ativa;
  • mantém paralelismo entre usuários diferentes;
  • adiciona backoff exponencial com jitter aos retries Serializable para conflitos externos/restantes, em vez de repetir imediatamente em lockstep;
  • adiciona testes do executor por chave e do backoff/retry.

Escopo dos outros erros do log

Os DiscordAPIError[50001] Missing Access e 50013 Missing Permissions são respostas do Discord para canais configurados onde o bot não consegue acessar/enviar. O outbox já trata 50001/50013 como falhas terminais; isso exige corrigir o canal/permissões no servidor Discord, não um retry de código.

## Problema O Voice XP podia processar a mesma sessão simultaneamente pelo flush periódico e por eventos de voz (saída, mute/deaf ou retorno). As transações Serializable protegiam a consistência, mas o PostgreSQL precisava abortar/repetir transações concorrentes, gerando `P2034`/write-conflict no log e trabalho desnecessário. ## Correção - serializa operações de sessão por `guildId:userId` dentro do processo; - aplica a mesma serialização a início, checkpoint, encerramento e limpeza de sessão inativa; - revalida o estado de voz antes de remover uma sessão considerada inativa, evitando apagar uma sessão que acabou de voltar a ficar ativa; - mantém paralelismo entre usuários diferentes; - adiciona backoff exponencial com jitter aos retries Serializable para conflitos externos/restantes, em vez de repetir imediatamente em lockstep; - adiciona testes do executor por chave e do backoff/retry. ## Escopo dos outros erros do log Os `DiscordAPIError[50001] Missing Access` e `50013 Missing Permissions` são respostas do Discord para canais configurados onde o bot não consegue acessar/enviar. O outbox já trata 50001/50013 como falhas terminais; isso exige corrigir o canal/permissões no servidor Discord, não um retry de código.
Sign in to join this conversation.
No description provided.