mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-10-30 18:13:23 +08:00
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
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user