]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
OPTIM: server: eb lookup for server_find_by_name()
authorAurelien DARRAGON <adarragon@haproxy.com>
Mon, 4 Dec 2023 17:40:36 +0000 (18:40 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Thu, 21 Dec 2023 13:22:26 +0000 (14:22 +0100)
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.

src/server.c

index 8dc57f10f3b4e7c273cb50f56d1fc458fa169047..25290fe2c2aaa69e21f7b0cdcaedfad98484aaf5 100644 (file)
@@ -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)