fix: handle session closure during concurrent TMDB requests
- Re-ensure session before each request attempt to handle race conditions - Add AttributeError handling for None session - Detect 'Connector is closed' errors and recreate session - Fixes AttributeError: 'NoneType' object has no attribute 'get' during concurrent NFO processing
This commit is contained in:
@@ -115,6 +115,12 @@ class TMDBClient:
|
|||||||
|
|
||||||
for attempt in range(max_retries):
|
for attempt in range(max_retries):
|
||||||
try:
|
try:
|
||||||
|
# Re-ensure session before each attempt in case it was closed
|
||||||
|
await self._ensure_session()
|
||||||
|
|
||||||
|
if self.session is None:
|
||||||
|
raise TMDBAPIError("Session is not available")
|
||||||
|
|
||||||
logger.debug(f"TMDB API request: {endpoint} (attempt {attempt + 1})")
|
logger.debug(f"TMDB API request: {endpoint} (attempt {attempt + 1})")
|
||||||
async with self.session.get(url, params=params, timeout=aiohttp.ClientTimeout(total=30)) as resp:
|
async with self.session.get(url, params=params, timeout=aiohttp.ClientTimeout(total=30)) as resp:
|
||||||
if resp.status == 401:
|
if resp.status == 401:
|
||||||
@@ -133,8 +139,14 @@ class TMDBClient:
|
|||||||
self._cache[cache_key] = data
|
self._cache[cache_key] = data
|
||||||
return data
|
return data
|
||||||
|
|
||||||
except aiohttp.ClientError as e:
|
except (aiohttp.ClientError, AttributeError) as e:
|
||||||
last_error = e
|
last_error = e
|
||||||
|
# If connector/session was closed, try to recreate it
|
||||||
|
if "Connector is closed" in str(e) or isinstance(e, AttributeError):
|
||||||
|
logger.warning(f"Session issue detected, recreating session: {e}")
|
||||||
|
self.session = None
|
||||||
|
await self._ensure_session()
|
||||||
|
|
||||||
if attempt < max_retries - 1:
|
if attempt < max_retries - 1:
|
||||||
logger.warning(f"Request failed (attempt {attempt + 1}): {e}, retrying in {delay}s")
|
logger.warning(f"Request failed (attempt {attempt + 1}): {e}, retrying in {delay}s")
|
||||||
await asyncio.sleep(delay)
|
await asyncio.sleep(delay)
|
||||||
|
|||||||
Reference in New Issue
Block a user