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.
diff --git a/src/cfgparse.c b/src/cfgparse.c
index ceaa96e..5589ec0 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -1775,6 +1775,8 @@
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 <id> argument and\n"
" optionnally supports [addr1]:port1[-end1]{,[addr]:port[-end]}...\n",
@@ -1790,7 +1792,12 @@
err_code |= ERR_ALERT | ERR_FATAL;
}
+ for (node = ebis_lookup(&proxy_by_name, args[1]); node; node = ebpt_next(node)) {
+ curproxy = container_of(node, struct proxy, conf.by_name);
+
- for (curproxy = proxy; curproxy != NULL; curproxy = curproxy->next) {
+ 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 @@
* 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);