diff --git a/src/cfgdiag.c b/src/cfgdiag.c index f8e4a9e08..c3b05e5d6 100644 --- a/src/cfgdiag.c +++ b/src/cfgdiag.c @@ -8,6 +8,10 @@ #include #include +struct cookie_entry { + struct ebpt_node node; +}; + /* Use this function to emit diagnostic. * This can be used as a shortcut to set value pointed by to 1 at the * same time. @@ -41,43 +45,42 @@ static inline void *diag_alloc(size_t size) * value. Backup servers are not taken into account as it can be quite common to * share cookie values in this case. */ -static void check_server_cookies(int *ret) +static void srv_diag_cookies(int *ret, struct server *srv, struct eb_root *cookies_tree) { - struct cookie_entry { - struct ebpt_node node; - }; + struct ebpt_node *cookie_node; + /* do not take into account backup servers */ + if (!srv->cookie || (srv->flags & SRV_F_BACKUP)) + return; + + cookie_node = ebis_lookup(cookies_tree, srv->cookie); + if (cookie_node) { + diag_warning(ret, "parsing [%s:%d] : 'server %s' : same cookie value is set for a previous non-backup server in the same backend, it may break connection persistence\n", + srv->conf.file, srv->conf.line, srv->id); + } + else { + cookie_node = diag_alloc(sizeof(*cookie_node)); + cookie_node->key = srv->cookie; + ebis_insert(cookies_tree, cookie_node); + } +} + +/* Perform a series of diagnostics on every servers from the configuration. */ +static void run_servers_diag(int *ret) +{ + struct eb_root cookies_tree = EB_ROOT_UNIQUE; + struct ebpt_node *cookie_node; struct proxy *px; struct server *srv; - struct eb_root cookies_tree = EB_ROOT_UNIQUE; - struct ebpt_node *cookie_node; - struct cookie_entry *cookie_entry; - struct ebpt_node *node; - for (px = proxies_list; px; px = px->next) { - for (srv = px->srv; srv; srv = srv->next) { - /* do not take into account backup servers */ - if (!srv->cookie || (srv->flags & SRV_F_BACKUP)) - continue; + for (srv = px->srv; srv; srv = srv->next) + srv_diag_cookies(ret, srv, &cookies_tree); - cookie_node = ebis_lookup(&cookies_tree, srv->cookie); - if (cookie_node) { - diag_warning(ret, "parsing [%s:%d] : 'server %s' : same cookie value is set for a previous non-backup server in the same backend, it may break connection persistence\n", - srv->conf.file, srv->conf.line, srv->id); - continue; - } - - cookie_entry = diag_alloc(sizeof(*cookie_entry)); - cookie_entry->node.key = srv->cookie; - ebis_insert(&cookies_tree, &cookie_entry->node); - } - - /* clear the tree and free its entries */ - while ((node = ebpt_first(&cookies_tree))) { - cookie_entry = ebpt_entry(node, struct cookie_entry, node); - eb_delete(&node->node); - free(cookie_entry); + /* clear the cookies tree before passing to the next proxy */ + while ((cookie_node = ebpt_first(&cookies_tree))) { + ebpt_delete(cookie_node); + free(cookie_node); } } } @@ -91,7 +94,7 @@ int cfg_run_diagnostics() { int ret = 0; - check_server_cookies(&ret); + run_servers_diag(&ret); return ret; }