feat(client): les erreurs réseau deviennent des erreurs retentables - #16
Open
arsenik-dtheo[bot] wants to merge 2 commits into
Open
arsenik-dtheo[bot] wants to merge 2 commits into
arsenik-dtheo[bot] wants to merge 2 commits into
Conversation
… retentables Échecs réseau (connexion refusée, DNS, timeout de lecture, connexion réinitialisée, flux coupé) rejoués puis absorbés, Typesafe::ConnectionError levée à épuisement avec l'exception d'origine en cause, aucune exception réseau brute échappant à #evaluate, politique de délai identique aux erreurs retentables HTTP, héritage Jev. (cherry picked from commit ced95cb)
…rror Nouvelle Typesafe::ConnectionError < APIError, retentable, sans statut HTTP, qui enveloppe les échecs réseau survenus avant toute réponse HTTP (connexion refusée, échec DNS, timeouts de connexion/lecture/écriture, connexion réinitialisée, flux coupé, poignée de main TLS) avec l'exception d'origine conservée en cause. Aucune exception réseau brute ne s'échappe plus de Client#evaluate : la boucle de retentative rejoue la requête et n'élève la ConnectionError qu'à épuisement du budget, selon la même politique de délai que 429/529/5xx (backoff exponentiel 0,5 s -> 8 s + jitter).
arsenik-dtheo
Bot
force-pushed
the
epic-6/03-erreurs-connexion
branch
from
September 21, 2026 06:12
5aca8e9 to
e4c86d1
Compare
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #10
Partie de l'épic #6
🔍 Ce que fait cette PR
Les échecs au niveau réseau cessent d'être levés bruts : une nouvelle
Typesafe::ConnectionError(sous-classe deAPIError, retentable,statusnil) encapsule les familles d'exceptions réseau — connexion refusée, reset, hôtes/joignables inatteignables, timeouts de connexion/lecture/écriture, connexion réinitialisée, flux coupé, échec DNS, erreur TLS. Une coupure brève est absorbée par la boucle de retentative du ticket 01 (même politique de délai) ; à épuisement, laConnectionErrorest levée avec l'exception d'origine encause. L'appelant garde un uniquerescue Typesafe::Error.✅ Critères couverts
spec/typesafe/client_spec.rbparamétré surECONNREFUSED,ECONNRESET,Net::ReadTimeout,EOFError,Resolv::ResolvError+to_timeout: 2 requêtes, réponse attendueTypesafe::ConnectionErrorest levée, sous-classe deAPIError, avec l'exception d'origine en cause → 3 requêtes,cause= l'Errnod'origine,retryable? == trueClient#evaluate→ 7 familles testées, aucune ne fuitConnectionErrorest traitée comme retentable : elle suit exactement la même politique de délai que 429/529/5xx → même boucleattempt, backoff 0,5 → 1,0 s + jitter assertéJevtesté (spec/typesafe/jev_spec.rb)👀 Comment vérifier
bundle exec rspec spec/typesafe/client_spec.rb -e "réseau"(ou-e "connection") — scénarios paramétrés sur les familles d'exceptionsTypesafe::ConnectionError(cause visible) remplace l'Errnobrut🧪 Vérifications
Typesafe::Client#evaluate/Typesafe::Jev#evaluate(WebMock sur l'endpoint + stub de sommeil) — cf.## Décisions de testde la specruby --parser=prism -csur lib + spec ; aucune toolchain de types dans ce dépôt)retry_options:— ticket 04)Signalements
[NIT]de la revue (cycle 1, verdict APPROVED), non bloquants, non corrigés ici :EADDRNOTAVAIL,ENETDOWN,EHOSTDOWN,ECONNABORTED,ENETRESET) s'échappent encore bruts ; capterSystemCallErrorremplacerait cinq constantes et fermerait le critère « uniquerescue Typesafe::Error» — la liste est explicitement déléguée à l'implémentation, arbitrage resserrable plus tardTimeout::Errorcapte plus large que les timeouts HTTP (leTimeout.timeoutd'un appelant serait avalé et rejoué) ; préférerNet::OpenTimeout/ReadTimeout/WriteTimeoutseuls — jugement, non appliquéResolv::ResolvErrorpas « ≥ 3.3 only » ;Net::WriteTimeoutun no-op car sous-classe deTimeout::Error) — à réécrire au ticket 05 avec la docnetwork_errors/raw_network_errorsquasi dupliquées dans la spec ; familles write-timeout et TLS non paramétrées ; balise YARD@raisemal employée📚 Références
docs/plans/retry-client/spec.mdepic-6/02-retry-after←epic-6/03-erreurs-connexion