BUG/MINOR: mux-h2/trace: Fix traces on h2c initialization
When a new H2 connection is initialized, the connection context is not changed
before the end. So, traces emitted during this initialization are buggy, except
the last one when no error occurred, because the connection context is not an
h2c.
To fix the bug, the connection context is saved and set as soon as possible. So,
the connection can always safely be used in all traces, except for the very
first one. And on error, the connection context is restored.
No need to backport.
diff --git a/src/mux_h2.c b/src/mux_h2.c
index 2c295fc..34c580d 100644
--- a/src/mux_h2.c
+++ b/src/mux_h2.c
@@ -781,8 +781,9 @@
{
struct h2c *h2c;
struct task *t = NULL;
+ void *conn_ctx = conn->ctx;
- TRACE_ENTER(H2_EV_H2C_NEW, conn);
+ TRACE_ENTER(H2_EV_H2C_NEW);
h2c = pool_alloc(pool_head_h2c);
if (!h2c)
@@ -854,6 +855,8 @@
LIST_INIT(&h2c->sending_list);
LIST_INIT(&h2c->buf_wait.list);
+ conn->ctx = h2c;
+
if (t)
task_queue(t);
@@ -861,17 +864,15 @@
/* FIXME: this is temporary, for outgoing connections we need
* to immediately allocate a stream until the code is modified
* so that the caller calls ->attach(). For now the outgoing cs
- * is stored as conn->ctx by the caller.
+ * is stored as conn->ctx by the caller and saved in conn_ctx.
*/
struct h2s *h2s;
- h2s = h2c_bck_stream_new(h2c, conn->ctx, sess);
+ h2s = h2c_bck_stream_new(h2c, conn_ctx, sess);
if (!h2s)
goto fail_stream;
}
- conn->ctx = h2c;
-
/* prepare to read something */
h2c_restart_reading(h2c, 1);
TRACE_LEAVE(H2_EV_H2C_NEW, conn);
@@ -884,7 +885,8 @@
tasklet_free(h2c->wait_event.tasklet);
pool_free(pool_head_h2c, h2c);
fail_no_h2c:
- TRACE_DEVEL("leaving in error", H2_EV_H2C_NEW|H2_EV_H2C_END|H2_EV_H2C_ERR, conn);
+ conn->ctx = conn_ctx; /* restore saved ctx */
+ TRACE_DEVEL("leaving in error", H2_EV_H2C_NEW|H2_EV_H2C_END|H2_EV_H2C_ERR);
return -1;
}