MEDIUM: stream: move the frontend's pointer to the session
Just like for the listener, the frontend is session-wide so let's move
it to the session. There are a lot of places which were changed but the
changes are minimal in fact.
diff --git a/src/stream.c b/src/stream.c
index 290c565..132e425 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -122,7 +122,7 @@
goto out_free_stream;
s->sess->listener = l;
- s->fe = p;
+ s->sess->fe = p;
s->si[0].flags = SI_FL_NONE;
s->si[1].flags = SI_FL_ISBACK;
@@ -290,9 +290,9 @@
end = date2str_log(trash.str + trash.len, &tm, &(s->logs.accept_date), trash.size - trash.len);
trash.len = end - trash.str;
if (sess->listener->name)
- chunk_appendf(&trash, "] %s/%s", s->fe->id, sess->listener->name);
+ chunk_appendf(&trash, "] %s/%s", sess->fe->id, sess->listener->name);
else
- chunk_appendf(&trash, "] %s/%d", s->fe->id, sess->listener->luid);
+ chunk_appendf(&trash, "] %s/%d", sess->fe->id, sess->listener->luid);
}
/* This function kills an existing embryonic stream. It stops the connection's
@@ -308,10 +308,10 @@
unsigned int log = s->logs.logwait;
const char *err_msg;
- if (s->fe->options2 & PR_O2_LOGERRORS)
+ if (sess->fe->options2 & PR_O2_LOGERRORS)
level = LOG_ERR;
- if (log && (s->fe->options & PR_O_NULLNOLOG)) {
+ if (log && (sess->fe->options & PR_O_NULLNOLOG)) {
/* with "option dontlognull", we don't log connections with no transfer */
if (!conn->err_code ||
conn->err_code == CO_ER_PRX_EMPTY || conn->err_code == CO_ER_PRX_ABORT ||
@@ -330,9 +330,9 @@
prepare_mini_sess_log_prefix(s);
err_msg = conn_err_code_str(conn);
if (err_msg)
- send_log(s->fe, level, "%s: %s\n", trash.str, err_msg);
+ send_log(sess->fe, level, "%s: %s\n", trash.str, err_msg);
else
- send_log(s->fe, level, "%s: unknown connection error (code=%d flags=%08x)\n",
+ send_log(sess->fe, level, "%s: unknown connection error (code=%d flags=%08x)\n",
trash.str, conn->err_code, conn->flags);
}
@@ -340,7 +340,7 @@
conn_force_close(conn);
conn_free(conn);
- s->fe->feconn--;
+ sess->fe->feconn--;
stream_store_counters(s);
if (!(sess->listener->options & LI_O_UNLIMITED))
@@ -354,9 +354,9 @@
if (!LIST_ISEMPTY(&global_listener_queue))
dequeue_all_listeners(&global_listener_queue);
- if (!LIST_ISEMPTY(&s->fe->listener_queue) &&
- (!s->fe->fe_sps_lim || freq_ctr_remain(&s->fe->fe_sess_per_sec, s->fe->fe_sps_lim, 0) > 0))
- dequeue_all_listeners(&s->fe->listener_queue);
+ if (!LIST_ISEMPTY(&sess->fe->listener_queue) &&
+ (!sess->fe->fe_sps_lim || freq_ctr_remain(&sess->fe->fe_sess_per_sec, sess->fe->fe_sps_lim, 0) > 0))
+ dequeue_all_listeners(&sess->fe->listener_queue);
task_delete(s->task);
task_free(s->task);
@@ -423,7 +423,7 @@
{
struct session *sess = s->sess;
struct listener *l = sess->listener;
- struct proxy *p = s->fe;
+ struct proxy *p = sess->fe;
struct http_txn *txn;
struct task *t = s->task;
struct connection *conn = __objt_conn(s->target);
@@ -448,7 +448,7 @@
* This changes later when switching rules are executed or
* when the default backend is assigned.
*/
- s->be = s->fe;
+ s->be = sess->fe;
s->comp_algo = NULL;
s->req.buf = s->res.buf = NULL;
@@ -482,7 +482,7 @@
*/
si_attach_conn(&s->si[0], conn);
- if (likely(s->fe->options2 & PR_O2_INDEPSTR))
+ if (likely(sess->fe->options2 & PR_O2_INDEPSTR))
s->si[0].flags |= SI_FL_INDEP_STR;
/* pre-initialize the other side's stream interface to an INIT state. The
@@ -491,7 +491,7 @@
si_reset(&s->si[1]);
si_detach(&s->si[1]);
- if (likely(s->fe->options2 & PR_O2_INDEPSTR))
+ if (likely(sess->fe->options2 & PR_O2_INDEPSTR))
s->si[1].flags |= SI_FL_INDEP_STR;
stream_init_srv_conn(s);
@@ -517,7 +517,7 @@
s->res.flags |= CF_ISRESP;
s->res.analysers = 0;
- if (s->fe->options2 & PR_O2_NODELAY) {
+ if (sess->fe->options2 & PR_O2_NODELAY) {
s->req.flags |= CF_NEVER_WAIT;
s->res.flags |= CF_NEVER_WAIT;
}
@@ -591,7 +591,7 @@
static void stream_free(struct stream *s)
{
struct http_txn *txn = &s->txn;
- struct proxy *fe = s->fe;
+ struct proxy *fe = strm_sess(s)->fe;
struct bref *bref, *back;
struct connection *cli_conn = objt_conn(s->si[0].end);
int i;
@@ -815,7 +815,7 @@
bytes = s->req.total - s->logs.bytes_in;
s->logs.bytes_in = s->req.total;
if (bytes) {
- s->fe->fe_counters.bytes_in += bytes;
+ sess->fe->fe_counters.bytes_in += bytes;
s->be->be_counters.bytes_in += bytes;
@@ -847,7 +847,7 @@
bytes = s->res.total - s->logs.bytes_out;
s->logs.bytes_out = s->res.total;
if (bytes) {
- s->fe->fe_counters.bytes_out += bytes;
+ sess->fe->fe_counters.bytes_out += bytes;
s->be->be_counters.bytes_out += bytes;
@@ -1071,7 +1071,7 @@
if (s->be->mode == PR_MODE_TCP) { /* let's allow immediate data connection in this case */
/* if the user wants to log as soon as possible, without counting
* bytes from the server, then this is the right moment. */
- if (!LIST_ISEMPTY(&s->fe->logformat) && !(s->logs.logwait & LW_BYTES)) {
+ if (!LIST_ISEMPTY(&strm_sess(s)->fe->logformat) && !(s->logs.logwait & LW_BYTES)) {
s->logs.t_close = s->logs.t_connect; /* to get a valid end date */
s->do_log(s);
}
@@ -1081,7 +1081,7 @@
rep->flags |= CF_READ_DONTWAIT; /* a single read is enough to get response headers */
}
- rep->analysers |= s->fe->fe_rsp_ana | s->be->be_rsp_ana;
+ rep->analysers |= strm_sess(s)->fe->fe_rsp_ana | s->be->be_rsp_ana;
rep->flags |= CF_READ_ATTACHED; /* producer is now attached */
if (req->flags & CF_WAKE_CONNECT) {
req->flags |= CF_WAKE_ONCE;
@@ -1274,7 +1274,7 @@
if (!(s->flags & SF_FINST_MASK)) {
if (s->si[1].state < SI_ST_REQ) {
- s->fe->fe_counters.failed_req++;
+ strm_sess(s)->fe->fe_counters.failed_req++;
if (strm_sess(s)->listener->counters)
strm_sess(s)->listener->counters->failed_req++;
@@ -1379,6 +1379,7 @@
static int process_switching_rules(struct stream *s, struct channel *req, int an_bit)
{
struct persist_rule *prst_rule;
+ struct proxy *fe = strm_sess(s)->fe;
req->analysers &= ~an_bit;
req->analyse_exp = TICK_ETERNITY;
@@ -1396,11 +1397,11 @@
if (!(s->flags & SF_BE_ASSIGNED)) {
struct switching_rule *rule;
- list_for_each_entry(rule, &s->fe->switching_rules, list) {
+ list_for_each_entry(rule, &fe->switching_rules, list) {
int ret = 1;
if (rule->cond) {
- ret = acl_exec_cond(rule->cond, s->fe, s, &s->txn, SMP_OPT_DIR_REQ|SMP_OPT_FINAL);
+ ret = acl_exec_cond(rule->cond, fe, s, &s->txn, SMP_OPT_DIR_REQ|SMP_OPT_FINAL);
ret = acl_pass(ret);
if (rule->cond->pol == ACL_COND_UNLESS)
ret = !ret;
@@ -1436,12 +1437,12 @@
* backend if any.
*/
if (!(s->flags & SF_BE_ASSIGNED))
- if (!stream_set_backend(s, s->fe->defbe.be ? s->fe->defbe.be : s->be))
+ if (!stream_set_backend(s, fe->defbe.be ? fe->defbe.be : s->be))
goto sw_failed;
}
/* we don't want to run the TCP or HTTP filters again if the backend has not changed */
- if (s->fe == s->be) {
+ if (fe == s->be) {
s->req.analysers &= ~AN_REQ_INSPECT_BE;
s->req.analysers &= ~AN_REQ_HTTP_PROCESS_BE;
}
@@ -1867,7 +1868,7 @@
stream_int_report_error(si_f);
if (!(req->analysers) && !(res->analysers)) {
s->be->be_counters.cli_aborts++;
- s->fe->fe_counters.cli_aborts++;
+ sess->fe->fe_counters.cli_aborts++;
if (srv)
srv->counters.cli_aborts++;
if (!(s->flags & SF_ERR_MASK))
@@ -1888,7 +1889,7 @@
srv->counters.failed_resp++;
if (!(req->analysers) && !(res->analysers)) {
s->be->be_counters.srv_aborts++;
- s->fe->fe_counters.srv_aborts++;
+ sess->fe->fe_counters.srv_aborts++;
if (srv)
srv->counters.srv_aborts++;
if (!(s->flags & SF_ERR_MASK))
@@ -2036,7 +2037,7 @@
}
if (ana_list & AN_REQ_HTTP_PROCESS_FE) {
- if (!http_process_req_common(s, req, AN_REQ_HTTP_PROCESS_FE, s->fe))
+ if (!http_process_req_common(s, req, AN_REQ_HTTP_PROCESS_FE, sess->fe))
break;
UPDATE_ANALYSERS(req->analysers, ana_list, ana_back, AN_REQ_HTTP_PROCESS_FE);
}
@@ -2235,28 +2236,28 @@
req->analysers = 0;
if (req->flags & CF_READ_ERROR) {
s->be->be_counters.cli_aborts++;
- s->fe->fe_counters.cli_aborts++;
+ sess->fe->fe_counters.cli_aborts++;
if (srv)
srv->counters.cli_aborts++;
s->flags |= SF_ERR_CLICL;
}
else if (req->flags & CF_READ_TIMEOUT) {
s->be->be_counters.cli_aborts++;
- s->fe->fe_counters.cli_aborts++;
+ sess->fe->fe_counters.cli_aborts++;
if (srv)
srv->counters.cli_aborts++;
s->flags |= SF_ERR_CLITO;
}
else if (req->flags & CF_WRITE_ERROR) {
s->be->be_counters.srv_aborts++;
- s->fe->fe_counters.srv_aborts++;
+ sess->fe->fe_counters.srv_aborts++;
if (srv)
srv->counters.srv_aborts++;
s->flags |= SF_ERR_SRVCL;
}
else {
s->be->be_counters.srv_aborts++;
- s->fe->fe_counters.srv_aborts++;
+ sess->fe->fe_counters.srv_aborts++;
if (srv)
srv->counters.srv_aborts++;
s->flags |= SF_ERR_SRVTO;
@@ -2268,28 +2269,28 @@
res->analysers = 0;
if (res->flags & CF_READ_ERROR) {
s->be->be_counters.srv_aborts++;
- s->fe->fe_counters.srv_aborts++;
+ sess->fe->fe_counters.srv_aborts++;
if (srv)
srv->counters.srv_aborts++;
s->flags |= SF_ERR_SRVCL;
}
else if (res->flags & CF_READ_TIMEOUT) {
s->be->be_counters.srv_aborts++;
- s->fe->fe_counters.srv_aborts++;
+ sess->fe->fe_counters.srv_aborts++;
if (srv)
srv->counters.srv_aborts++;
s->flags |= SF_ERR_SRVTO;
}
else if (res->flags & CF_WRITE_ERROR) {
s->be->be_counters.cli_aborts++;
- s->fe->fe_counters.cli_aborts++;
+ sess->fe->fe_counters.cli_aborts++;
if (srv)
srv->counters.cli_aborts++;
s->flags |= SF_ERR_CLICL;
}
else {
s->be->be_counters.cli_aborts++;
- s->fe->fe_counters.cli_aborts++;
+ sess->fe->fe_counters.cli_aborts++;
if (srv)
srv->counters.cli_aborts++;
s->flags |= SF_ERR_CLITO;
@@ -2336,8 +2337,8 @@
(objt_conn(si_f->end) && __objt_conn(si_f->end)->xprt && __objt_conn(si_f->end)->xprt->rcv_pipe) &&
(objt_conn(si_b->end) && __objt_conn(si_b->end)->xprt && __objt_conn(si_b->end)->xprt->snd_pipe) &&
(pipes_used < global.maxpipes) &&
- (((s->fe->options2|s->be->options2) & PR_O2_SPLIC_REQ) ||
- (((s->fe->options2|s->be->options2) & PR_O2_SPLIC_AUT) &&
+ (((sess->fe->options2|s->be->options2) & PR_O2_SPLIC_REQ) ||
+ (((sess->fe->options2|s->be->options2) & PR_O2_SPLIC_AUT) &&
(req->flags & CF_STREAMER_FAST)))) {
req->flags |= CF_KERN_SPLICING;
}
@@ -2357,8 +2358,8 @@
if (unlikely((req->flags & (CF_SHUTW|CF_SHUTW_NOW|CF_AUTO_CLOSE|CF_SHUTR)) ==
(CF_AUTO_CLOSE|CF_SHUTR))) {
channel_shutw_now(req);
- if (tick_isset(s->fe->timeout.clientfin)) {
- res->wto = s->fe->timeout.clientfin;
+ if (tick_isset(sess->fe->timeout.clientfin)) {
+ res->wto = sess->fe->timeout.clientfin;
res->wex = tick_add(now_ms, res->wto);
}
}
@@ -2385,8 +2386,8 @@
if (si_f->flags & SI_FL_NOHALF)
si_f->flags |= SI_FL_NOLINGER;
si_shutr(si_f);
- if (tick_isset(s->fe->timeout.clientfin)) {
- res->wto = s->fe->timeout.clientfin;
+ if (tick_isset(sess->fe->timeout.clientfin)) {
+ res->wto = sess->fe->timeout.clientfin;
res->wex = tick_add(now_ms, res->wto);
}
}
@@ -2491,14 +2492,14 @@
req->rto = req->wto = res->rto = res->wto =
s->be->timeout.tunnel;
- if ((req->flags & CF_SHUTR) && tick_isset(s->fe->timeout.clientfin))
- res->wto = s->fe->timeout.clientfin;
+ if ((req->flags & CF_SHUTR) && tick_isset(sess->fe->timeout.clientfin))
+ res->wto = sess->fe->timeout.clientfin;
if ((req->flags & CF_SHUTW) && tick_isset(s->be->timeout.serverfin))
res->rto = s->be->timeout.serverfin;
if ((res->flags & CF_SHUTR) && tick_isset(s->be->timeout.serverfin))
req->wto = s->be->timeout.serverfin;
- if ((res->flags & CF_SHUTW) && tick_isset(s->fe->timeout.clientfin))
- req->rto = s->fe->timeout.clientfin;
+ if ((res->flags & CF_SHUTW) && tick_isset(sess->fe->timeout.clientfin))
+ req->rto = sess->fe->timeout.clientfin;
req->rex = tick_add(now_ms, req->rto);
req->wex = tick_add(now_ms, req->wto);
@@ -2514,8 +2515,8 @@
(objt_conn(si_f->end) && __objt_conn(si_f->end)->xprt && __objt_conn(si_f->end)->xprt->snd_pipe) &&
(objt_conn(si_b->end) && __objt_conn(si_b->end)->xprt && __objt_conn(si_b->end)->xprt->rcv_pipe) &&
(pipes_used < global.maxpipes) &&
- (((s->fe->options2|s->be->options2) & PR_O2_SPLIC_RTR) ||
- (((s->fe->options2|s->be->options2) & PR_O2_SPLIC_AUT) &&
+ (((sess->fe->options2|s->be->options2) & PR_O2_SPLIC_RTR) ||
+ (((sess->fe->options2|s->be->options2) & PR_O2_SPLIC_AUT) &&
(res->flags & CF_STREAMER_FAST)))) {
res->flags |= CF_KERN_SPLICING;
}
@@ -2545,8 +2546,8 @@
if (unlikely((res->flags & (CF_SHUTW|CF_SHUTW_NOW)) == CF_SHUTW_NOW &&
channel_is_empty(res))) {
si_shutw(si_f);
- if (tick_isset(s->fe->timeout.clientfin)) {
- req->rto = s->fe->timeout.clientfin;
+ if (tick_isset(sess->fe->timeout.clientfin)) {
+ req->rto = sess->fe->timeout.clientfin;
req->rex = tick_add(now_ms, req->rto);
}
}
@@ -2610,7 +2611,7 @@
if (likely((si_f->state != SI_ST_CLO) ||
(si_b->state > SI_ST_INI && si_b->state < SI_ST_CLO))) {
- if ((s->fe->options & PR_O_CONTSTATS) && (s->flags & SF_BE_ASSIGNED))
+ if ((sess->fe->options & PR_O_CONTSTATS) && (s->flags & SF_BE_ASSIGNED))
stream_process_counters(s);
if (si_f->state == SI_ST_EST && obj_type(si_f->end) != OBJ_TYPE_APPCTX)
@@ -2686,7 +2687,7 @@
return t; /* nothing more to do */
}
- s->fe->feconn--;
+ sess->fe->feconn--;
if (s->flags & SF_BE_ASSIGNED)
s->be->beconn--;
jobs--;
@@ -2701,9 +2702,9 @@
if (!LIST_ISEMPTY(&global_listener_queue))
dequeue_all_listeners(&global_listener_queue);
- if (!LIST_ISEMPTY(&s->fe->listener_queue) &&
- (!s->fe->fe_sps_lim || freq_ctr_remain(&s->fe->fe_sess_per_sec, s->fe->fe_sps_lim, 0) > 0))
- dequeue_all_listeners(&s->fe->listener_queue);
+ if (!LIST_ISEMPTY(&sess->fe->listener_queue) &&
+ (!sess->fe->fe_sps_lim || freq_ctr_remain(&sess->fe->fe_sess_per_sec, sess->fe->fe_sps_lim, 0) > 0))
+ dequeue_all_listeners(&sess->fe->listener_queue);
}
if (unlikely((global.mode & MODE_DEBUG) &&
@@ -2725,10 +2726,10 @@
if (n < 1 || n > 5)
n = 0;
- if (s->fe->mode == PR_MODE_HTTP) {
- s->fe->fe_counters.p.http.rsp[n]++;
+ if (sess->fe->mode == PR_MODE_HTTP) {
+ sess->fe->fe_counters.p.http.rsp[n]++;
if (s->comp_algo && (s->flags & SF_COMP_READY))
- s->fe->fe_counters.p.http.comp_rsp++;
+ sess->fe->fe_counters.p.http.comp_rsp++;
}
if ((s->flags & SF_BE_ASSIGNED) &&
(s->be->mode == PR_MODE_HTTP)) {
@@ -2740,9 +2741,9 @@
}
/* let's do a final log if we need it */
- if (!LIST_ISEMPTY(&s->fe->logformat) && s->logs.logwait &&
+ if (!LIST_ISEMPTY(&sess->fe->logformat) && s->logs.logwait &&
!(s->flags & SF_MONITOR) &&
- (!(s->fe->options & PR_O_NULLNOLOG) || req->total)) {
+ (!(sess->fe->options & PR_O_NULLNOLOG) || req->total)) {
s->do_log(s);
}