/* h1 stats module */
enum {
+ H1_ST_OPEN_CONN,
+ H1_ST_OPEN_STREAM,
H1_STATS_COUNT /* must be the last member of the enum */
};
static struct name_desc h1_stats[] = {
+ [H1_ST_OPEN_CONN] = { .name = "h1_open_connections",
+ .desc = "Count of currently open connections" },
+ [H1_ST_OPEN_STREAM] = { .name = "h1_open_streams",
+ .desc = "Count of currently open streams" },
};
static struct h1_counters {
+ long long open_conns; /* count of currently open connections */
+ long long open_streams; /* count of currently open streams */
} h1_counters;
static void h1_fill_stats(void *data, struct field *stats)
{
+ struct h1_counters *counters = data;
+
+ stats[H1_ST_OPEN_CONN] = mkf_u64(FN_GAUGE, counters->open_conns);
+ stats[H1_ST_OPEN_STREAM] = mkf_u64(FN_GAUGE, counters->open_streams);
}
static struct stats_module h1_stats_module = {
goto err;
}
+ HA_ATOMIC_INC(&h1s->h1c->px_counters->open_streams);
+
h1s->h1c->flags = (h1s->h1c->flags & ~H1C_F_ST_EMBRYONIC) | H1C_F_ST_ATTACHED | H1C_F_ST_READY;
TRACE_LEAVE(H1_EV_STRM_NEW, h1s->h1c->conn, h1s);
return cs;
if (h1c->px->options2 & PR_O2_RSPBUG_OK)
h1s->res.err_pos = -1;
+ HA_ATOMIC_INC(&h1c->px_counters->open_streams);
+
TRACE_LEAVE(H1_EV_H1S_NEW, h1c->conn, h1s);
return h1s;
TRACE_STATE("set shudown on h1c", H1_EV_H1S_END, h1c->conn, h1s);
h1c->flags |= H1C_F_ST_SHUTDOWN;
}
+
+ HA_ATOMIC_DEC(&h1c->px_counters->open_streams);
pool_free(pool_head_h1s, h1s);
}
}
else if (h1_recv_allowed(h1c))
h1c->conn->xprt->subscribe(h1c->conn, h1c->conn->xprt_ctx, SUB_RETRY_RECV, &h1c->wait_event);
+ HA_ATOMIC_INC(&h1c->px_counters->open_conns);
+
/* mux->wake will be called soon to complete the operation */
TRACE_LEAVE(H1_EV_H1C_NEW, conn, h1c->h1s);
return 0;
&h1c->wait_event);
h1_shutw_conn(conn);
}
+
+ HA_ATOMIC_DEC(&h1c->px_counters->open_conns);
pool_free(pool_head_h1c, h1c);
}