keepalive timer also closes a freshly dialed pooled connection during the HTTP/1.1 TLS upgrade
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 58/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- erlang
- Domaine
- backend, networking
Piste de recherche
Start with the fresh-dial path in hackney_pool.erl:573-587 and 1005-1024, then trace connected and upgrade_to_ssl in hackney_conn.erl:845-869 and 996-1013. Compare the HTTP/1.1 and HTTP/2 upgrade branches, and run the pool-enabled HTTP/1 TLS-upgrade tests with a delayed handshake; done means a fresh connection is not closed by the keepalive timer during that handshake.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
hackney 4.7.4 (also current master).
#934 disarms the keepalive timer in the is_ready probe, which covers a reused pooled connection. A fresh dial does not reach is_ready:
handle_call({checkout, ...})takes thenone -> start_connectionbranch (hackney_pool.erl:573-587).- The new conn arms
idle_timeout = keepalive_timeouton entry toconnected(hackney_conn.erl:845-869).keepalive_timeoutis capped at 2000 ms bymin/2inhackney_pool.erl:476-482(aninfinityvalue also collapses to 2000 because of Erlang term order), andstart_connection/6does not take a per-checkout override (hackney_pool.erl:1005-1024). - The HTTP/1.1 branch of
upgrade_to_sslreturnskeep_stateand leaves thatstate_timeoutrunning (hackney_conn.erl:1012-1013). The HTTP/2 branch cancels it viainit_h2_after_upgrade(:2995-3007). ssl:connect/3at:996blocks the gen_statem. If the TLS handshake takes longer than the remaining timer, the timer fires (:915-917), the conn goes toclosed, and the caller's{request, ...}hits the catch-all and gets{error, invalid_state}(:2005-2006on 4.7.4;{error, closed}on master after #936). No byte of the request has been written at that point.
Reproduced with a TCP proxy in front of api.stripe.com that delays the ClientHello: a 1900 ms delay succeeds, a 2200 ms delay fails with invalid_state, with pool enabled and protocols: [http1]. With prewarm_count: 0 the fresh-dial path is the only path, so the failure rate is simply the fraction of handshakes slower than ~2 s.
Suggested fix: arm the idle timer in connected(enter) only when owner =:= pool_pid (prewarm conns set owner => PoolPid at hackney_pool.erl:1367; fresh-dial conns set owner => Requester at :1024), cancel it in set_owner when the new owner is not the pool, and add the HTTP/2 branch's CancelIdle action to the HTTP/1.1 branch of upgrade_to_ssl.
Related: #916 (stuck in upgrade_to_ssl), #922 (handshake bounded by connect_timeout), #934, #936.
- Langage dominant
- Erlang
- Étoiles
- 1.4k
- Forks
- 458
- Merge moyen
- 11 h 32 min
- PR mergées (30 j)
- 47
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de benoitc/hackney
-
Support Certifi 2.19.xOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
Les mainteneurs répondent en général sous 1 jour
-
Implement HTTP QUERY (RFC 10008)Ouverte
Difficulté 3/5 1-2 jours Accessibilité débutants 48/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 4/5 3-5 jours Accessibilité débutants 45/100
Les mainteneurs répondent en général sous 1 jour
-
Upgrading to 4.x strategyOuverte
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 25/100
benoitc/hackney#907 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
feature
Difficulté 4/5 3-5 jours Accessibilité débutants 35/100
benoitc/hackney#596 · 4 commentaires ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de benoitc/hackney
Issues similaires
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
Les mainteneurs répondent en général sous 1 jour
-
customer report feature-request-triage
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Codeinwp/optimole-wp#1239 ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
NimblePros/eShopOnWeb#332 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
-
bug
Difficulté 2/5 Moins d'une heure Accessibilité débutants 82/100
ecosyste-ms/commits#1031 ·
Les mainteneurs répondent en général sous 1 jour