From 237250cc0d89492b4434c577b2256fdc430ddad4 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 29 Jul 2011 01:49:03 +0200 Subject: [PATCH] [BUG] proxy: stats frontend and peers were missing many initializers This was revealed with one of the very latest patches which caused the listener_queue not to be initialized on the stats socket frontend. And in fact a number of other ones were missing too. This is getting so boring that now we'll always make use of the same function to initialize any proxy. Doing so has even saved about 500 bytes on the binary due to the avoided code redundancy. No backport is needed. --- include/proto/proxy.h | 1 + src/cfgparse.c | 41 ++--------------------------------------- src/dumpstats.c | 13 +------------ src/proxy.c | 29 +++++++++++++++++++++++++++++ 4 files changed, 33 insertions(+), 51 deletions(-) diff --git a/include/proto/proxy.h b/include/proto/proxy.h index afcfa0aab..2b5328c68 100644 --- a/include/proto/proxy.h +++ b/include/proto/proxy.h @@ -43,6 +43,7 @@ struct proxy *findproxy_mode(const char *name, int mode, int cap); struct proxy *findproxy(const char *name, int cap); struct server *findserver(const struct proxy *px, const char *name); int proxy_cfg_ensure_no_http(struct proxy *curproxy); +void init_new_proxy(struct proxy *p); int get_backend_server(const char *bk_name, const char *sv_name, struct proxy **bk, struct server **sv); diff --git a/src/cfgparse.c b/src/cfgparse.c index fd81a203e..04373acf6 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -1020,34 +1020,6 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm) return err_code; } -/* Perform the most basic initialization of a proxy : - * memset(), list_init(*), reset_timeouts(*). - */ -static void init_new_proxy(struct proxy *p) -{ - memset(p, 0, sizeof(struct proxy)); - LIST_INIT(&p->pendconns); - LIST_INIT(&p->acl); - LIST_INIT(&p->http_req_rules); - LIST_INIT(&p->block_cond); - LIST_INIT(&p->redirect_rules); - LIST_INIT(&p->mon_fail_cond); - LIST_INIT(&p->switching_rules); - LIST_INIT(&p->persist_rules); - LIST_INIT(&p->sticking_rules); - LIST_INIT(&p->storersp_rules); - LIST_INIT(&p->tcp_req.inspect_rules); - LIST_INIT(&p->tcp_rep.inspect_rules); - LIST_INIT(&p->tcp_req.l4_rules); - LIST_INIT(&p->req_add); - LIST_INIT(&p->rsp_add); - LIST_INIT(&p->listener_queue); - - /* Timeouts are defined as -1 */ - proxy_reset_timeouts(p); - p->tcp_rep.inspect_delay = TICK_ETERNITY; -} - void init_default_instance() { init_new_proxy(&defproxy); @@ -1278,19 +1250,10 @@ int cfg_parse_peers(const char *file, int linenum, char **args, int kwm) err_code |= ERR_ALERT | ERR_ABORT; goto out; } + + init_new_proxy(curpeers->peers_fe); curpeers->peers_fe->parent = curpeers; - LIST_INIT(&(curpeers->peers_fe)->pendconns); - LIST_INIT(&(curpeers->peers_fe)->acl); - LIST_INIT(&(curpeers->peers_fe)->block_cond); - LIST_INIT(&(curpeers->peers_fe)->redirect_rules); - LIST_INIT(&(curpeers->peers_fe)->mon_fail_cond); - LIST_INIT(&(curpeers->peers_fe)->switching_rules); - LIST_INIT(&(curpeers->peers_fe)->tcp_req.inspect_rules); - LIST_INIT(&(curpeers->peers_fe)->tcp_rep.inspect_rules); - - proxy_reset_timeouts(curpeers->peers_fe); - curpeers->peers_fe->last_change = now.tv_sec; curpeers->peers_fe->id = strdup(args[1]); curpeers->peers_fe->cap = PR_CAP_FE; diff --git a/src/dumpstats.c b/src/dumpstats.c index 96999852c..9caebdd59 100644 --- a/src/dumpstats.c +++ b/src/dumpstats.c @@ -153,18 +153,7 @@ static struct proxy *alloc_stats_fe(const char *name) if (!fe) return NULL; - LIST_INIT(&fe->pendconns); - LIST_INIT(&fe->acl); - LIST_INIT(&fe->block_cond); - LIST_INIT(&fe->redirect_rules); - LIST_INIT(&fe->mon_fail_cond); - LIST_INIT(&fe->switching_rules); - LIST_INIT(&fe->tcp_req.inspect_rules); - - /* Timeouts are defined as -1, so we cannot use the zeroed area - * as a default value. - */ - proxy_reset_timeouts(fe); + init_new_proxy(fe); fe->last_change = now.tv_sec; fe->id = strdup("GLOBAL"); diff --git a/src/proxy.c b/src/proxy.c index 7c22a75fc..3b56c86ea 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -403,6 +403,35 @@ int proxy_cfg_ensure_no_http(struct proxy *curproxy) return 0; } +/* Perform the most basic initialization of a proxy : + * memset(), list_init(*), reset_timeouts(*). + * Any new proxy should be initialized via this function. + */ +void init_new_proxy(struct proxy *p) +{ + memset(p, 0, sizeof(struct proxy)); + LIST_INIT(&p->pendconns); + LIST_INIT(&p->acl); + LIST_INIT(&p->http_req_rules); + LIST_INIT(&p->block_cond); + LIST_INIT(&p->redirect_rules); + LIST_INIT(&p->mon_fail_cond); + LIST_INIT(&p->switching_rules); + LIST_INIT(&p->persist_rules); + LIST_INIT(&p->sticking_rules); + LIST_INIT(&p->storersp_rules); + LIST_INIT(&p->tcp_req.inspect_rules); + LIST_INIT(&p->tcp_rep.inspect_rules); + LIST_INIT(&p->tcp_req.l4_rules); + LIST_INIT(&p->req_add); + LIST_INIT(&p->rsp_add); + LIST_INIT(&p->listener_queue); + + /* Timeouts are defined as -1 */ + proxy_reset_timeouts(p); + p->tcp_rep.inspect_delay = TICK_ETERNITY; +} + /* * This function creates all proxy sockets. It should be done very early, * typically before privileges are dropped. The sockets will be registered