Repository navigation
fix: preserve SQLite commit outcomes during cancellation - #696
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configuration
⛔ Files ignored due to path filters (6)
📒 Files selected for processing (3)
Included review availability: This review used your included allowance. Your plan provides up to 8 included reviews per hour; 7 remain after this review. WalkthroughThe write path now checks cancellation before commit and runs an accepted commit without the caller's cancellation. Tests cover cancellation at the commit fence and after SQLite commits. The daemon roster integration test uses a dedicated retry-loop definition with a longer timeout. ChangesWrite commit cancellation
Daemon roster retry fixture
Priority: ➖ Normal Estimated code review effort: 2 (Simple) | ~12 minutes Change: Bug fix Merge Risk: ⚪ Minimal · up to No outstanding issue is established by this review. Merge after the pending CI checks pass. 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Corrige uma ambiguidade na confirmação de transações SQLite: quando o contexto expirava durante um COMMIT já concluído, a gravação retornava erro e o retry podia duplicar um evento de ferramenta. A fronteira compartilhada agora verifica o cancelamento após a autorização e conclui o COMMIT preservando seu resultado real. Cancelamento observado antes dessa etapa continua causando rollback.
A falha surgiu no shard Go 2 da release #688 (
112218483055). Reproduções com SQLite real e race detector em macOS e Linux expuseram dois eventos onde deveria existir um. A regressão determinística na suíte existenteTestExecuteWritefalha antes da correção; o teste original do daemon mantém suas asserções e seus prazos.O runtime (
112218483056) também revelou que a jornada de histórico reutilizava um timeout de dois segundos destinado ao cenário de lifecycle. Ela agora tem uma fixture própria, bloqueada até o cancelamento real e recuperada no retry, com orçamento de dez segundos para a preparação da sessão. Permanecem as duas tentativas obrigatórias e o limite total de 45 segundos. O cenário específico de timeout continua com seus dois segundos e sua fixture original.Validação já concluída:
TestExecuteWritecom race: passou (16,293 s).make test-e2e-runtime: 313 testes passaram localmente (daemon, HTTP, UDS, harness e CLI).486ea616: E2E runtime aprovado, os mesmos 313 testes passaram em Linux.486ea616: shard Go 2 aprovado, incluindo daemon com race, banco global e integração real de Goal. Todos os oito shards Go passaram.make gatefinal passou: lint Go sem problemas e todas as suítes Go afetadas com race. CI final do head486ea616568c4585b6d265e938a8de4632c87b4baprovado: 33 checks passaram, 17 skips esperados, sem falhas ou pendências. Inclui todos os shards Go/Web e E2E Desktop. CodeRabbit aprovou esse mesmo head; nenhuma discussão de revisão permanece aberta.Impacto registrado em
docs/_memory/change-impact.md; evidência emdocs/qa/reports/2026-10-05-dependency-upgrades.md. Sem alterações de schema, contratos públicos, configuração, hooks, IDs de tools ou isolamento de workspace/perfil. Inclui nota de release.Revisão de duração do COMMIT (Greptile): a confirmação permanece síncrona, com conexão e admissão pertencentes à chamada até seu retorno; não cria goroutine ou tarefa destacada. A configuração compartilhada usa
busy_timeout(5000)para espera por locks. Isso não constitui um limite total de I/O. O própriomodernc.org/[email protected]executatx.Commit()comcontext.Background(). Emstmt.exec, um cancelamento concorrente substitui o resultado real porctx.Err(), inclusive após sucesso. Um novo deadline nessa etapa recriaria o defeito em outra fronteira temporal. A interrupção SQLite é cooperativa e explicitamente permite que uma operação quase concluída termine; não fornece um limite rígido de I/O. Mantemos o cancelamento antes do commit e preservamos o resultado da confirmação iniciada, sem introduzir um novo sistema de execução assíncrona.