From: Willy Tarreau Date: Fri, 13 Mar 2015 14:55:16 +0000 (+0100) Subject: MINOR: proxy: store the default target into the frontend's configuration X-Git-Tag: v1.6-dev2~322 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f87ab94e3b5e30e99aafea24ee28106f61400d4b;p=thirdparty%2Fhaproxy.git MINOR: proxy: store the default target into the frontend's configuration Some services such as peers and CLI pre-set the target applet immediately during accept(), and for this reason they're forced to have a dedicated accept() function which does not even properly follow everything the regular one does (eg: sndbuf/rcvbuf/linger/nodelay are not set, etc). Let's store the default target when known into the frontend's config so that it's session_accept() which automatically sets it. --- diff --git a/include/types/proxy.h b/include/types/proxy.h index 30409f9f03..0cd00eef86 100644 --- a/include/types/proxy.h +++ b/include/types/proxy.h @@ -329,6 +329,7 @@ struct proxy { time_t last_change; /* last time, when the state was changed */ int (*accept)(struct session *s); /* application layer's accept() */ struct conn_src conn_src; /* connection source settings */ + enum obj_type *default_target; /* default target to use for accepted sessions or NULL */ struct proxy *next; unsigned int log_count; /* number of logs produced by the frontend */ diff --git a/src/dumpstats.c b/src/dumpstats.c index 8dd9459ba0..50e77ad573 100644 --- a/src/dumpstats.c +++ b/src/dumpstats.c @@ -234,7 +234,6 @@ extern const char *stat_status_codes[]; */ static int stats_accept(struct session *s) { - s->target = &cli_applet.obj_type; /* no need to initialize the applet, it will start with st0=st1 = 0 */ tv_zero(&s->logs.tv_request); @@ -277,6 +276,7 @@ static struct proxy *alloc_stats_fe(const char *name, const char *file, int line fe->conf.file = strdup(file); fe->conf.line = line; fe->accept = stats_accept; + fe->default_target = &cli_applet.obj_type; /* the stats frontend is the only one able to assign ID #0 */ fe->conf.id.key = fe->uuid = 0; diff --git a/src/peers.c b/src/peers.c index 1181aaeacf..3fc48822c5 100644 --- a/src/peers.c +++ b/src/peers.c @@ -1096,7 +1096,6 @@ static void peer_session_forceshutdown(struct session * session) */ static int peer_accept(struct session *s) { - s->target = &peer_applet.obj_type; /* no need to initialize the applet, it will start with st0=st1 = 0 */ tv_zero(&s->logs.tv_request); @@ -1126,6 +1125,7 @@ void peers_setup_frontend(struct proxy *fe) fe->conn_retries = CONN_RETRIES; fe->timeout.client = MS_TO_TICKS(5000); fe->accept = peer_accept; + fe->default_target = &peer_applet.obj_type; fe->options2 |= PR_O2_INDEPSTR | PR_O2_SMARTCON | PR_O2_SMARTACC; } diff --git a/src/session.c b/src/session.c index 94fc875b08..7a00b0d5a9 100644 --- a/src/session.c +++ b/src/session.c @@ -481,7 +481,7 @@ int session_complete(struct session *s) s->si[1].flags |= SI_FL_INDEP_STR; session_init_srv_conn(s); - s->target = NULL; + s->target = p->default_target; /* used by peers and CLI */ s->pend_pos = NULL; /* init store persistence */