From 7cbc915a1d009f167ffa2f2dcff84edbcce7d2f2 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sat, 15 Mar 2014 08:17:08 +0100 Subject: [PATCH] MEDIUM: config: faster lookup for duplicated proxy name cfg_parse_listen() currently checks for duplicated proxy names. Now that we have a tree for this, we can use it. The config load time was further reduced by 1.6, which is now about 4.5 times faster than what it was without the trees. In fact it was the last CPU-intensive processing involving proxy names. Now the only remaining point is the automatic fullconn computation which can be bypassed by having a fullconn in the defaults section, reducing the load time by another 10x. --- src/cfgparse.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/cfgparse.c b/src/cfgparse.c index ceaa96e4a9..5589ec03f7 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -1775,6 +1775,8 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int kwm) rc = PR_CAP_NONE; if (rc != PR_CAP_NONE) { /* new proxy */ + struct ebpt_node *node; + if (!*args[1]) { Alert("parsing [%s:%d] : '%s' expects an argument and\n" " optionnally supports [addr1]:port1[-end1]{,[addr]:port[-end]}...\n", @@ -1790,7 +1792,12 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int kwm) err_code |= ERR_ALERT | ERR_FATAL; } - for (curproxy = proxy; curproxy != NULL; curproxy = curproxy->next) { + for (node = ebis_lookup(&proxy_by_name, args[1]); node; node = ebpt_next(node)) { + curproxy = container_of(node, struct proxy, conf.by_name); + + if (strcmp(curproxy->id, args[1]) != 0) + break; + /* * If there are two proxies with the same name only following * combinations are allowed: @@ -1802,9 +1809,8 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int kwm) * ruleset - - - - */ - if (!strcmp(curproxy->id, args[1]) && - (rc!=(PR_CAP_FE|PR_CAP_RS) || curproxy->cap!=(PR_CAP_BE|PR_CAP_RS)) && - (rc!=(PR_CAP_BE|PR_CAP_RS) || curproxy->cap!=(PR_CAP_FE|PR_CAP_RS))) { + if ((rc != (PR_CAP_FE|PR_CAP_RS) || curproxy->cap != (PR_CAP_BE|PR_CAP_RS)) && + (rc != (PR_CAP_BE|PR_CAP_RS) || curproxy->cap != (PR_CAP_FE|PR_CAP_RS))) { Warning("Parsing [%s:%d]: %s '%s' has same name as another %s (declared at %s:%d).\n", file, linenum, proxy_cap_str(rc), args[1], proxy_type_str(curproxy), curproxy->conf.file, curproxy->conf.line); -- 2.47.3