fix(retry): herken de Prisma 7 driver-adapter foutvormen #97
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "claude/strange-proskuriakova-fef463"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Wat er stuk was
De retry-lussen matchten op velden die Prisma 7 +
@prisma/adapter-pgniet meer vult. Beide predicaten herkenden niets en degradeerden stil naar één poging.Gemeten op Postgres 17.9 / Prisma 7.8:
23505PrismaClientKnownRequestErrorP2002,meta.targetafwezigmeta.driverAdapterError.cause.constraint.fields40001in de callbackmeta.driverAdapterError.cause40001bij COMMITDriverAdapterError, geencode, geenmetacauseDe P2002-message rendert nog steeds
Unique constraint failed on the fields: (`product_id`, `code`)— die tekst komt uitconstraint.fields, niet uitmeta.target. De melding suggereert dus een veld dat leeg is.Getroffen:
withCodeUniqueRetry(nul retries, altijd),withSerializableRetry(commit-time conflicten) encreate-sprint.ts(identieke blindheid).Wat er verandert
src/lib/prisma-driver-error.ts(nieuw) — haalt de driver-adapter-cause uit beide verpakkingen; predicaten matchen opcause.originalCode(de SQLSTATE). De legacymeta.target-tak blijft staan voor andere adapters.src/lib/retry-backoff.ts(nieuw) — full jitter, 5 ms basis / 100 ms plafond. Zonder wachttijd retryen de verliezers van een contended create in dezelfde tick en botsen opnieuw.create-sprint.ts— zelfde defect, gaat mee.CLAUDE.md— foutvormen-tabel en waarom mocks hier niet als guard werken.Metingen (vóór → na)
23505→withCodeUniqueRetry40001bij commit →withSerializableRetrycreate_pbiOver de bestaande integratietest
create-concurrency.integration.test.tswas geen betrouwbare guard: op een snelle lokale DB slaagt hij ook met de retry volledig kapot, omdat het conflict daar op40001uitkomt (wél geretryd) in plaats van23505(niet geretryd). Op een tragere/remote DB faalt hij deterministisch. Vandaar twee nieuwe tests die fouten afspelen die Postgres écht opwierp — bevestigd: ze falen zónder de fix en slagen ermee. Handgebouwde error-objecten asserten de vorm waaruit ze gebouwd zijn en zien deze regressie principieel niet.Verificatie
npx vitest runmétTEST_DATABASE_URL: 1266/1266 groen (zonder DB: 1263 + 3 skipped)npm run typecheck+npm run typecheck:tests: schoonstasht om elke meting te ijkenCaveat
Er stond geen Postgres op deze machine; de metingen komen van een wegwerp-PG 17.9 met het schema via
prisma db push(dus zonder CHECK-constraints — niet relevant voor dit pad, wel voor wie de opzet hergebruikt).