diff --git a/reference_api/availability/worker.py b/reference_api/availability/worker.py index 0f4a534..1b3521e 100644 --- a/reference_api/availability/worker.py +++ b/reference_api/availability/worker.py @@ -33,9 +33,12 @@ async def _site_loop( site_timeout: float, error_backoff: float, ) -> None: + client: BlazarClient | None = None while True: try: - await _sync_site(cache, site_id, cloud_name, site_timeout) + if client is None: + client = BlazarClient(cloud_name) + await _sync_site(cache, site_id, client, site_timeout) await asyncio.sleep(poll_interval) except Exception: # pylint: disable=broad-exception-caught LOG.exception("Availability sync failed for site %s, backing off", site_id) @@ -45,14 +48,13 @@ async def _site_loop( async def _sync_site( cache: AvailabilityCache, site_id: str, - cloud_name: str, + client: BlazarClient, site_timeout: float, ) -> None: LOG.info("Starting availability sync for site %s", site_id) loop = asyncio.get_running_loop() def _fetch(): - client = BlazarClient(cloud_name) return client.list_host_allocations() nodes, known_uuids, unavailable_uuids = await asyncio.wait_for( diff --git a/reference_api/main.py b/reference_api/main.py index a5a0e95..e285d42 100644 --- a/reference_api/main.py +++ b/reference_api/main.py @@ -157,8 +157,9 @@ def _warmup_flavor_clients(ref_dir: Path) -> None: def _fetch_flavor_availability( cloud_name: str, flavor_id: str, start_date: datetime, end_date: datetime ) -> list[dict]: - client = _site_clients.get(cloud_name) or BlazarClient(cloud_name) - return client.get_flavor_availability(flavor_id, start_date, end_date) + if cloud_name not in _site_clients: + _site_clients[cloud_name] = BlazarClient(cloud_name) + return _site_clients[cloud_name].get_flavor_availability(flavor_id, start_date, end_date) @lru_cache(maxsize=1) diff --git a/reference_api/services/utils.py b/reference_api/services/utils.py index 7030077..681c74e 100644 --- a/reference_api/services/utils.py +++ b/reference_api/services/utils.py @@ -209,4 +209,4 @@ def build_paginated_response( def get_version(repo_root: Path) -> Optional[str]: """Gets the repository version for a given repo_root.""" - return filesystem.get_version(repo_root) + return filesystem.get_release_and_timestamp(repo_root).get("version") diff --git a/reference_api/storage/filesystem.py b/reference_api/storage/filesystem.py index 1207255..3dce102 100644 --- a/reference_api/storage/filesystem.py +++ b/reference_api/storage/filesystem.py @@ -133,10 +133,6 @@ def read_flavor(ref_dir: Path, site_id: str, flavor_id: str) -> Optional[Dict]: return _read_json(ref_dir / f"sites/{site_id}/flavors/{flavor_id}.json") -def get_version(repo_path: Path) -> Optional[str]: - return git_versioning.get_version(repo_path) - - def list_versions( repo_path: Path, dir_path: Optional[Path] = None ) -> List[Dict]: diff --git a/reference_api/storage/git_versioning.py b/reference_api/storage/git_versioning.py index d2400c2..7cee961 100644 --- a/reference_api/storage/git_versioning.py +++ b/reference_api/storage/git_versioning.py @@ -10,12 +10,7 @@ git_cache: LRUCache = LRUCache(maxsize=1024) - - -def get_version(repo_path: Path) -> Optional[str]: - """Return the git HEAD sha for the provided repo_path""" - repo = Repo(repo_path, search_parent_directories=True) - return repo.head.commit.hexsha +_release_cache: LRUCache = LRUCache(maxsize=8) def _get_relative_dir_path(repo_root: Path, dir_path: Path) -> Optional[str]: @@ -132,7 +127,7 @@ def get_version_info( return None -@cached(git_cache) +@cached(_release_cache) def get_release_and_timestamp(repo_path: Path) -> Dict[str, Optional[str]]: """Get the current release (HEAD sha) and timestamp for the repo.""" result: Dict[str, Optional[str]] = {"version": None, "timestamp": None} diff --git a/tests/test_storage_filesystem.py b/tests/test_storage_filesystem.py index 99ab796..2b0054e 100644 --- a/tests/test_storage_filesystem.py +++ b/tests/test_storage_filesystem.py @@ -33,12 +33,6 @@ def test_read_cluster(mock_ref_dir): assert cluster.get("uid") == "chameleon" -def test_version_helpers(mock_ref_dir): - v = filesystem.get_version(mock_ref_dir) - # may be None in test env but should not raise - assert True - - def test_list_nodes(mock_ref_dir): nodes = filesystem.list_nodes(mock_ref_dir, "uc", "chameleon") assert nodes and len(nodes) == 2