MINOR: mux: Make sure every string is woken up after the handshake.

In case any stream was waiting for the handshake after receiving early data,
we have to wake all of them. Do so by making the mux responsible for
removing the CO_FL_EARLY_DATA flag after all of them are woken up, instead
of doing it in si_cs_wake_cb(), which would then only work for the first one.
This makes wait_for_handshake work with HTTP/2.
This commit is contained in:
Olivier Houchard 2017-11-23 18:25:47 +01:00 committed by Willy Tarreau
parent 90084a133d
commit 7fc96d5a01
3 changed files with 15 additions and 1 deletions

View File

@ -2086,6 +2086,15 @@ static int h2_wake(struct connection *conn)
{
struct h2c *h2c = conn->mux_ctx;
/*
* If we received early data, try to wake any stream, just in case
* at least one of them was waiting for the handshake
*/
if ((conn->flags & (CO_FL_EARLY_SSL_HS | CO_FL_EARLY_DATA | CO_FL_HANDSHAKE)) ==
CO_FL_EARLY_DATA) {
h2_wake_some_streams(h2c, 0, 0);
conn->flags &= ~CO_FL_EARLY_DATA;
}
if (conn->flags & CO_FL_ERROR || conn_xprt_read0_pending(conn) ||
h2c->st0 == H2_CS_ERROR2 || h2c->flags & H2_CF_GOAWAY_FAILED ||
(eb_is_empty(&h2c->streams_by_id) && h2c->last_sid >= 0 &&

View File

@ -51,6 +51,12 @@ static int mux_pt_wake(struct connection *conn)
ret = cs->data_cb->wake ? cs->data_cb->wake(cs) : 0;
/* If we had early data, and we're done with the handshake
* then whe know the data are safe, and we can remove the flag.
*/
if ((conn->flags & (CO_FL_EARLY_DATA | CO_FL_EARLY_SSL_HS | CO_FL_HANDSHAKE)) ==
CO_FL_EARLY_DATA)
conn->flags &= ~CO_FL_EARLY_DATA;
if (ret >= 0)
cs_update_mux_polling(cs);
return ret;

View File

@ -585,7 +585,6 @@ static int si_cs_wake_cb(struct conn_stream *cs)
* the handshake.
*/
if ((conn->flags & (CO_FL_EARLY_DATA | CO_FL_EARLY_SSL_HS)) == CO_FL_EARLY_DATA) {
conn->flags &= ~CO_FL_EARLY_DATA;
task_wakeup(si_task(si), TASK_WOKEN_MSG);
}