Skip to content

feat(client): les erreurs réseau deviennent des erreurs retentables - #16

Open
arsenik-dtheo[bot] wants to merge 2 commits into
epic-6/02-retry-afterfrom
epic-6/03-erreurs-connexion
Open

arsenik-dtheo[bot] wants to merge 2 commits into
epic-6/02-retry-afterfrom
epic-6/03-erreurs-connexion

Conversation

@arsenik-dtheo

@arsenik-dtheo arsenik-dtheo Bot commented Sep 20, 2026

Copy link
Copy Markdown
Contributor

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 de APIError, retentable, status nil) 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, la ConnectionError est levée avec l'exception d'origine en cause. L'appelant garde un unique rescue Typesafe::Error.

✅ Critères couverts

  • Un échec réseau (ex. connexion refusée) est retenté selon la politique par défaut, puis — en cas de succès — l'appel renvoie la réponse normalement → spec/typesafe/client_spec.rb paramétré sur ECONNREFUSED, ECONNRESET, Net::ReadTimeout, EOFError, Resolv::ResolvError + to_timeout : 2 requêtes, réponse attendue
  • À épuisement des retentatives sur échec réseau, une Typesafe::ConnectionError est levée, sous-classe de APIError, avec l'exception d'origine en cause → 3 requêtes, cause = l'Errno d'origine, retryable? == true
  • Aucune exception réseau brute ne s'échappe plus de Client#evaluate → 7 familles testées, aucune ne fuit
  • La ConnectionError est traitée comme retentable : elle suit exactement la même politique de délai que 429/529/5xx → même boucle attempt, backoff 0,5 → 1,0 s + jitter asserté
  • Héritage Jev testé (spec/typesafe/jev_spec.rb)

👀 Comment vérifier

  1. bundle exec rspec spec/typesafe/client_spec.rb -e "réseau" (ou -e "connection") — scénarios paramétrés sur les familles d'exceptions
  2. En vrai : couper le réseau quelques secondes pendant un appel — le client absorbe et réussit ; plus long — une Typesafe::ConnectionError (cause visible) remplace l'Errno brut

🧪 Vérifications

  • Seam de test : Typesafe::Client#evaluate / Typesafe::Jev#evaluate (WebMock sur l'endpoint + stub de sommeil) — cf. ## Décisions de test de la spec
  • typecheck propre (ruby --parser=prism -c sur lib + spec ; aucune toolchain de types dans ce dépôt)
  • suite complète verte (242 exemples, plusieurs seeds)
  • diff contenu dans le périmètre du ticket (classe + enveloppement + boucle ; pas de retry_options: — ticket 04)

⚠️ Écarts et arbitrages

Signalements [NIT] de la revue (cycle 1, verdict APPROVED), non bloquants, non corrigés ici :

  • Des errno non listés (EADDRNOTAVAIL, ENETDOWN, EHOSTDOWN, ECONNABORTED, ENETRESET) s'échappent encore bruts ; capter SystemCallError remplacerait cinq constantes et fermerait le critère « unique rescue Typesafe::Error » — la liste est explicitement déléguée à l'implémentation, arbitrage resserrable plus tard
  • Timeout::Error capte plus large que les timeouts HTTP (le Timeout.timeout d'un appelant serait avalé et rejoué) ; préférer Net::OpenTimeout/ReadTimeout/WriteTimeout seuls — jugement, non appliqué
  • Deux commentaires inexacts (Resolv::ResolvError pas « ≥ 3.3 only » ; Net::WriteTimeout un no-op car sous-classe de Timeout::Error) — à réécrire au ticket 05 avec la doc
  • Lists network_errors / raw_network_errors quasi dupliquées dans la spec ; familles write-timeout et TLS non paramétrées ; balise YARD @raise mal employée

📚 Références

@arsenik-dtheo
arsenik-dtheo Bot added this pull request to stack #19 September 20, 2026 23:41
… 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
arsenik-dtheo Bot force-pushed the epic-6/03-erreurs-connexion branch from 5aca8e9 to e4c86d1 Compare September 21, 2026 06:12
@arsenik-dtheo arsenik-dtheo Bot changed the title feat(client): les erreurs réseau deviennent des erreurs retentables (1.3.0) feat(client): les erreurs réseau deviennent des erreurs retentables Sep 21, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

03 : les erreurs réseau deviennent des erreurs retentables

0 participants