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.
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)