ExposedTransactionRunner: Exposed's default 3x retry re-runs claim+delivery on SQLException, multiplying duplicate deliveries
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 3/5
- Tempo estimado
- Meio dia
- Facilidade para iniciantes
- 62/100
Direção de pesquisa
Start with ExposedTransactionRunner.runInTransaction in the okapi-exposed module, which wraps the block in Exposed's transaction(database), and with processNext() to see the claim, deliver, update sequence. Check how Exposed's DatabaseConfig retry setting reaches that call. Done when a test shows the deliverer is invoked once when the store update throws SQLException, and the existing tests still pass.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Severity: Medium (duplicate delivery amplification) · Area: okapi-exposed ExposedTransactionRunner · Found in: code review of main @ e5630a1
Problem
ExposedTransactionRunner.runInTransaction is transaction(database) { block() }. Exposed retries the entire block on SQLException up to DatabaseConfig.defaultMaxAttempts times. The default is 3, which I confirmed in the bytecode of exposed-core 1.6.0.
For the outbox scheduler the block is processNext(): claim → network delivery → update. If the update or commit fails with an SQLException (deadlock victim, serialization failure, connection reset, oversized last_error, see the related issue), Exposed rolls back and re-runs the whole cycle immediately. It re-claims the same rows and delivers them again, up to 3 times per tick, with no backoff. The delivery side effect isn't transactional, so these retries only add duplicates and load on the downstream.
The purger and the metrics reads are idempotent, so retries are harmless there. The processor path is the problem.
Suggested fix
Disable Exposed's automatic retry for okapi's runner, e.g. transaction(database) { maxAttempts = 1; block() } (or the equivalent DatabaseConfig), and let okapi's own scheduler retry on the next tick. Add a test asserting that a deliverer is invoked once when the store update throws SQLException.
- Linguagem predominante
- Kotlin
- Estrelas
- 14
- Forks
- 0
- Merge médio
- 9h 54min
- PRs com merge (30d)
- 11
Preparar o ambiente
Este projeto não oferece contêiner de desenvolvimento, Dockerfile nem guia de contribuição, então a configuração fica por sua conta: comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de softwaremill/okapi
-
bug
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 35/100
softwaremill/okapi#141 ·
Mantenedores costumam responder em até 1 dia
-
OutboxProcessorListener events are emitted before the transaction commits; metrics over-count on commit failureTalvez já em andamento @rawo assumiu há 1 dia. Abertabreaking-change bug
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 35/100
softwaremill/okapi#137 ·
Mantenedores costumam responder em até 1 dia
-
enhancement
Dificuldade 4/5 1-2 dias Facilidade para iniciantes 42/100
softwaremill/okapi#136 ·
Mantenedores costumam responder em até 1 dia
-
breaking-change bug
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 35/100
softwaremill/okapi#135 ·
Mantenedores costumam responder em até 1 dia
-
enhancement
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 22/100
softwaremill/okapi#133 ·
Mantenedores costumam responder em até 1 dia
Todas as issues de softwaremill/okapi
Issues semelhantes
-
unconfirmed
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
thunderbird/thunderbird-android#11893 · 1 comentário ·
Mantenedores costumam responder em até 2 dias
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 65/100
Droid-Deck/DroidDeck#2198 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 77/100
world-federation-of-advertisers/cross-media-measurement#4846 ·
Mantenedores costumam responder em até 1 dia
-
autoteam community connectors/destination/mssql connectors/source/hubspot team/use
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 77/100
airbytehq/airbyte#91201 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
GetStream/stream-chat-android#6982 · 1 comentário ·
Mantenedores costumam responder em até 1 dia