struct connection *conn;
uint64_t nb_sc; /* number of attached stream connectors */
uint64_t nb_hreq; /* number of in-progress http requests */
+ uint64_t tot_sc; /* total number of stream connectors seen since conn init */
uint32_t flags; /* QC_CF_* */
enum qcc_app_st app_st; /* application layer state */
int glitches; /* total number of glitches on this connection */
qcs->flags |= QC_SF_HREQ_RECV;
++qcc->nb_sc;
++qcc->nb_hreq;
+ ++qcc->tot_sc;
/* TODO duplicated from mux_h2 */
sess->accept_date = date;
{
struct server *srv = __objt_server(conn->target);
struct qcc *qcc = conn->ctx;
+ int max_fctl, max_reuse = 0;
- BUG_ON(srv->max_reuse >= 0); /* TODO ensure max-reuse is enforced. */
- return qcc_fctl_avail_streams(qcc, 1);
+ max_fctl = qcc_fctl_avail_streams(qcc, 1);
+
+ if (srv->max_reuse >= 0) {
+ max_reuse = qcc->tot_sc <= srv->max_reuse ?
+ srv->max_reuse - qcc->tot_sc + 1: 0;
+ return MIN(max_fctl, max_reuse);
+ }
+ else {
+ return max_fctl;
+ }
}
/* Returns the number of streams currently attached into <conn> connection.
_qcc_init(qcc);
conn->ctx = qcc;
- qcc->nb_hreq = qcc->nb_sc = 0;
+ qcc->nb_hreq = qcc->nb_sc = qcc->tot_sc = 0;
qcc->flags = conn_is_back(conn) ? QC_CF_IS_BACK : 0;
qcc->app_st = QCC_APP_ST_NULL;
qcc->glitches = 0;
qcs->sess = sess;
qcs->sd = sc->sedesc;
qcc->nb_sc++;
+ qcc->tot_sc++;
}
TRACE_LEAVE(QMUX_EV_QCC_NEW, conn);
qcs->sess = sess;
qcs->sd = sd->sc->sedesc;
qcc->nb_sc++;
+ qcc->tot_sc++;
/* the connection is not idle anymore, let's mark this */
HA_ATOMIC_AND(&qcc->wait_event.tasklet->state, ~TASK_F_USR1);