From: Willy Tarreau Date: Thu, 10 Jul 2025 09:06:41 +0000 (+0200) Subject: MINOR: server: use the tree to look up the server name in findserver() X-Git-Tag: v3.3-dev4~96 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5e78ab33cd8ac0b8cf479bc5fe762555410451a1;p=thirdparty%2Fhaproxy.git MINOR: server: use the tree to look up the server name in findserver() Let's just use the tree-based lookup instead of walking through the list. This function is used to find duplicates in "track" statements and a few such places, so it's important not to waste too much time on large setups. --- diff --git a/include/haproxy/server.h b/include/haproxy/server.h index e435f9a1f..eb6d5fde6 100644 --- a/include/haproxy/server.h +++ b/include/haproxy/server.h @@ -61,7 +61,7 @@ const char *srv_update_check_addr_port(struct server *s, const char *addr, const const char *srv_update_agent_addr_port(struct server *s, const char *addr, const char *port); struct server *server_find_by_id(struct proxy *bk, int id); struct server *server_find_by_id_unique(struct proxy *bk, int id, uint32_t rid); -struct server *findserver(const struct proxy *px, const char *name); +struct server *findserver(struct proxy *px, const char *name); struct server *server_find_by_name(struct proxy *bk, const char *name); struct server *server_find_by_name_unique(struct proxy *bk, const char *name, uint32_t rid); struct server *server_find_best_match(struct proxy *bk, char *name, int id, int *diff); diff --git a/src/server.c b/src/server.c index 44e7c4858..7f3b81862 100644 --- a/src/server.c +++ b/src/server.c @@ -4006,20 +4006,17 @@ struct server *server_find_by_id_unique(struct proxy *bk, int id, uint32_t rid) * This function returns the server with a matching name within selected proxy, * or NULL if not found. */ - -struct server *findserver(const struct proxy *px, const char *name) +struct server *findserver(struct proxy *px, const char *name) { + struct ebpt_node *node; struct server *cursrv; if (!px) return NULL; - for (cursrv = px->srv; cursrv; cursrv = cursrv->next) { - if (strcmp(cursrv->id, name) == 0) - return cursrv; - } - - return NULL; + node = ebis_lookup(&px->conf.used_server_name, name); + cursrv = node ? container_of(node, struct server, conf.name) : NULL; + return cursrv; } /* Returns a pointer to the first server matching either name , or id