81 lines
2.6 KiB
Python
81 lines
2.6 KiB
Python
"""Application lifecycle and targeted cache invalidation."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
from infrastructure.http.client import close_http_clients
|
|
|
|
from ._registry import clear_all_singletons
|
|
from .service_providers import (
|
|
get_artist_discovery_service,
|
|
get_artist_enrichment_service,
|
|
get_album_enrichment_service,
|
|
get_album_discovery_service,
|
|
get_search_enrichment_service,
|
|
get_scrobble_service,
|
|
get_home_charts_service,
|
|
get_home_service,
|
|
get_discover_service,
|
|
get_discover_queue_manager,
|
|
get_lastfm_auth_service,
|
|
get_genre_cover_prewarm_service,
|
|
)
|
|
from .repo_providers import get_listenbrainz_repository
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def clear_lastfm_dependent_caches() -> None:
|
|
"""Clear LRU caches for all services that hold a reference to LastFmRepository."""
|
|
get_artist_discovery_service.cache_clear()
|
|
get_artist_enrichment_service.cache_clear()
|
|
get_album_enrichment_service.cache_clear()
|
|
get_search_enrichment_service.cache_clear()
|
|
get_scrobble_service.cache_clear()
|
|
get_home_charts_service.cache_clear()
|
|
get_home_service.cache_clear()
|
|
get_discover_service.cache_clear()
|
|
get_discover_queue_manager.cache_clear()
|
|
get_lastfm_auth_service.cache_clear()
|
|
|
|
|
|
def clear_listenbrainz_dependent_caches() -> None:
|
|
"""Clear LRU caches for all services that hold a reference to ListenBrainzRepository."""
|
|
get_listenbrainz_repository.cache_clear()
|
|
get_artist_discovery_service.cache_clear()
|
|
get_album_discovery_service.cache_clear()
|
|
get_search_enrichment_service.cache_clear()
|
|
get_scrobble_service.cache_clear()
|
|
get_home_charts_service.cache_clear()
|
|
get_home_service.cache_clear()
|
|
get_discover_service.cache_clear()
|
|
get_discover_queue_manager.cache_clear()
|
|
|
|
|
|
async def init_app_state(app) -> None:
|
|
logger.info("Application state initialized")
|
|
|
|
|
|
async def cleanup_app_state() -> None:
|
|
# Graceful service shutdown
|
|
try:
|
|
queue_mgr = get_discover_queue_manager()
|
|
queue_mgr.invalidate()
|
|
except (AttributeError, RuntimeError) as exc:
|
|
logger.error("Failed to invalidate discover queue manager during cleanup: %s", exc)
|
|
|
|
await close_http_clients()
|
|
|
|
# Shutdown genre prewarm service before clearing singletons
|
|
try:
|
|
prewarm_svc = get_genre_cover_prewarm_service()
|
|
await prewarm_svc.shutdown()
|
|
except (AttributeError, RuntimeError, OSError) as exc:
|
|
logger.error("Failed to shut down genre prewarm service during cleanup: %s", exc)
|
|
|
|
# Automatic cleanup via registry — no manual list needed
|
|
clear_all_singletons()
|
|
|
|
logger.info("Application state cleaned up")
|