From f1dfa2c67ab2e64fe9c5553fe0e14eacf6799db1 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Fri, 20 Mar 2026 14:39:20 +0100 Subject: [PATCH] Cache url path lookup I've seen py-spy dumps where usegalaxy.org was busy looking up routes. This is an easy win. Claude claims 87X speedup in a synthetic benchmark: https://gist.github.com/mvdbeek/a257c8885edba9e02482b598076eaa0e --- lib/galaxy/webapps/galaxy/api/__init__.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/galaxy/webapps/galaxy/api/__init__.py b/lib/galaxy/webapps/galaxy/api/__init__.py index c8dd2645775..97d98c914b4 100644 --- a/lib/galaxy/webapps/galaxy/api/__init__.py +++ b/lib/galaxy/webapps/galaxy/api/__init__.py @@ -211,6 +211,7 @@ def get_required_user( class UrlBuilder: def __init__(self, request: Request): self.request = request + self._route_cache: dict[str, Any] = {} def __call__(self, name: str, **path_params): qualified = path_params.pop("qualified", False) @@ -223,7 +224,7 @@ class UrlBuilder: else: url = str(self.request.url_for(name, **path_params)) else: - url = self.request.app.url_path_for(name, **path_params) + url = self._url_path_for_cached(name, **path_params) if query_params: url = f"{url}?{urlencode(query_params)}" return url @@ -233,6 +234,20 @@ class UrlBuilder: path_params.update(query_params) return web.url_for(name, **path_params) + def _url_path_for_cached(self, name: str, **path_params) -> str: + """Cached version of app.url_path_for that avoids repeated linear route scans.""" + cached_route = self._route_cache.get(name) + if cached_route is not None: + return cached_route.url_path_for(name, **path_params) + for route in self.request.app.routes: + try: + url = route.url_path_for(name, **path_params) + self._route_cache[name] = route + return url + except NoMatchFound: + pass + raise NoMatchFound(name, path_params) + class GalaxyASGIRequest(GalaxyAbstractRequest): """Wrapper around Starlette/FastAPI Request object.