From: Aurelien DARRAGON Date: Mon, 4 Dec 2023 17:40:36 +0000 (+0100) Subject: OPTIM: server: eb lookup for server_find_by_name() X-Git-Tag: v3.0-dev1~68 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4bcfe30414005323a8d4ab986bce92bb736b59df;p=thirdparty%2Fhaproxy.git OPTIM: server: eb lookup for server_find_by_name() server_find_by_name() function was added in 19a106d24 ("MINOR: server: server_find functions: id, name, best_match"). At that time, only the used_server_id proxy tree was available, thus the name lookup was performed as a linear search. However, used_server_name proxy tree was added in 84d6046a ("MINOR: proxy: Add a "server by name" tree to proxy."), so we may safely rely on it to perform server name lookups now. This will hopefully make the function quite faster, especially when performing lookups in huge backend farms. --- diff --git a/src/server.c b/src/server.c index 8dc57f10f3..25290fe2c2 100644 --- a/src/server.c +++ b/src/server.c @@ -3599,20 +3599,16 @@ struct server *server_find_by_name(struct proxy *bk, const char *name) curserver = NULL; if (*name == '#') { curserver = server_find_by_id(bk, atoi(name + 1)); - if (curserver) - return curserver; } else { - curserver = bk->srv; + struct ebpt_node *node; - while (curserver && (strcmp(curserver->id, name) != 0)) - curserver = curserver->next; - - if (curserver) - return curserver; + node = ebis_lookup(&bk->conf.used_server_name, name); + if (node) + curserver = container_of(node, struct server, conf.name); } - return NULL; + return curserver; } struct server *server_find_best_match(struct proxy *bk, char *name, int id, int *diff)