Skip to content

[Bug] Scan stops when request to metadata provider fails #2236

Description

@bonny1992

RomM version
4.0.1 / Docker

Describe the bug
When scanning, if a request to Hasheous and/or RetroAchievement fails (not sure about others), the entire scan will stop. At least, in my instance.

To Reproduce
Steps to reproduce the behavior:

  1. Scan ("Quick scan" but shouldn't matter)

Expected behavior
I'd expect the software to try some times (maybe an environment variable setting?) before interrupting the scan.

Screenshots
No screenshot but I have the part of the logs:

INFO:     [RomM][hasheous_handler][2025-08-08 16:56:37] No IGDB ID provided for Hasheous IGDB game lookup.
CRITICAL: [RomM][retroachievements][2025-08-08 16:56:42] Connection error: can't connect to RetroAchievements
Traceback (most recent call last):
  File "/src/.venv/lib/python3.13/site-packages/aiohttp/connector.py", line 1532, in _create_direct_connection
    hosts = await self._resolve_host(host, port, traces=traces)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/src/.venv/lib/python3.13/site-packages/aiohttp/connector.py", line 1148, in _resolve_host
    return await asyncio.shield(resolved_host_task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/src/.venv/lib/python3.13/site-packages/aiohttp/connector.py", line 1179, in _resolve_host_with_throttle
    addrs = await self._resolver.resolve(host, port, family=self._family)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/src/.venv/lib/python3.13/site-packages/aiohttp/resolver.py", line 40, in resolve
    infos = await self._loop.getaddrinfo(
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<5 lines>...
    )
    ^
  File "/usr/local/lib/python3.13/asyncio/base_events.py", line 939, in getaddrinfo
    return await self.run_in_executor(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
        None, getaddr_func, host, port, family, type, proto, flags)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/concurrent/futures/thread.py", line 59, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/usr/local/lib/python3.13/socket.py", line 977, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
               ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
socket.gaierror: [Errno -3] Try again

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/backend/adapters/services/retroachievements.py", line 54, in _request
    res = await aiohttp_session.get(
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<3 lines>...
    )
    ^
  File "/src/.venv/lib/python3.13/site-packages/aiohttp/client.py", line 770, in _request
    resp = await handler(req)
           ^^^^^^^^^^^^^^^^^^
  File "/src/.venv/lib/python3.13/site-packages/aiohttp/client_middlewares.py", line 36, in single_middleware_handler
    return await middleware(req, handler)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/backend/adapters/services/retroachievements.py", line 31, in auth_middleware
    return await handler(req)
           ^^^^^^^^^^^^^^^^^^
  File "/src/.venv/lib/python3.13/site-packages/aiohttp/client.py", line 725, in _connect_and_send_request
    conn = await self._connector.connect(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        req, traces=traces, timeout=real_timeout
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/src/.venv/lib/python3.13/site-packages/aiohttp/connector.py", line 642, in connect
    proto = await self._create_connection(req, traces, timeout)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/src/.venv/lib/python3.13/site-packages/aiohttp/connector.py", line 1209, in _create_connection
    _, proto = await self._create_direct_connection(req, traces, timeout)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/src/.venv/lib/python3.13/site-packages/aiohttp/connector.py", line 1538, in _create_direct_connection
    raise ClientConnectorDNSError(req.connection_key, exc) from exc
aiohttp.client_exceptions.ClientConnectorDNSError: Cannot connect to host retroachievements.org:443 ssl:default [Try again]
ERROR:    [RomM][scan][2025-08-08 16:56:42] Error in scan_platform: 503: Can't connect to RetroAchievements, check your internet connection
INFO:     [RomM][nginx][2025-08-08 16:56:42] 192.168.178.2 | - | GET /ws/socket.io/?EIO=4&transport=websocket 101 | 182704 | Chrome Windows | 2266.684
ERROR:    [RomM][worker][2025-08-08 16:56:42] [Job d2c257c1-85b4-4bf8-b60b-6197f9833eef]: exception raised while executing (endpoints.sockets.scan.scan_platforms)
Traceback (most recent call last):
  File "/src/.venv/lib/python3.13/site-packages/aiohttp/connector.py", line 1532, in _create_direct_connection
    hosts = await self._resolve_host(host, port, traces=traces)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/src/.venv/lib/python3.13/site-packages/aiohttp/connector.py", line 1148, in _resolve_host
    return await asyncio.shield(resolved_host_task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/src/.venv/lib/python3.13/site-packages/aiohttp/connector.py", line 1179, in _resolve_host_with_throttle
    addrs = await self._resolver.resolve(host, port, family=self._family)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/src/.venv/lib/python3.13/site-packages/aiohttp/resolver.py", line 40, in resolve
    infos = await self._loop.getaddrinfo(
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<5 lines>...
    )
    ^
  File "/usr/local/lib/python3.13/asyncio/base_events.py", line 939, in getaddrinfo
    return await self.run_in_executor(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
        None, getaddr_func, host, port, family, type, proto, flags)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/concurrent/futures/thread.py", line 59, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/usr/local/lib/python3.13/socket.py", line 977, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
               ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
socket.gaierror: [Errno -3] Try again

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/backend/adapters/services/retroachievements.py", line 54, in _request
    res = await aiohttp_session.get(
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<3 lines>...
    )
    ^
  File "/src/.venv/lib/python3.13/site-packages/aiohttp/client.py", line 770, in _request
    resp = await handler(req)
           ^^^^^^^^^^^^^^^^^^
  File "/src/.venv/lib/python3.13/site-packages/aiohttp/client_middlewares.py", line 36, in single_middleware_handler
    return await middleware(req, handler)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/backend/adapters/services/retroachievements.py", line 31, in auth_middleware
    return await handler(req)
           ^^^^^^^^^^^^^^^^^^
  File "/src/.venv/lib/python3.13/site-packages/aiohttp/client.py", line 725, in _connect_and_send_request
    conn = await self._connector.connect(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        req, traces=traces, timeout=real_timeout
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/src/.venv/lib/python3.13/site-packages/aiohttp/connector.py", line 642, in connect
    proto = await self._create_connection(req, traces, timeout)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/src/.venv/lib/python3.13/site-packages/aiohttp/connector.py", line 1209, in _create_connection
    _, proto = await self._create_direct_connection(req, traces, timeout)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/src/.venv/lib/python3.13/site-packages/aiohttp/connector.py", line 1538, in _create_direct_connection
    raise ClientConnectorDNSError(req.connection_key, exc) from exc
aiohttp.client_exceptions.ClientConnectorDNSError: Cannot connect to host retroachievements.org:443 ssl:default [Try again]

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/src/.venv/lib/python3.13/site-packages/rq/worker.py", line 1643, in perform_job
    return_value = job.perform()
  File "/src/.venv/lib/python3.13/site-packages/rq/job.py", line 1359, in perform
    self._result = self._execute()
                   ~~~~~~~~~~~~~^^
  File "/src/.venv/lib/python3.13/site-packages/rq/job.py", line 1396, in _execute
    coro_result = loop.run_until_complete(result)
  File "/usr/local/lib/python3.13/asyncio/base_events.py", line 725, in run_until_complete
    return future.result()
           ~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/contextlib.py", line 101, in inner
    return await func(*args, **kwds)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/backend/endpoints/sockets/scan.py", line 517, in scan_platforms
    raise e
  File "/backend/endpoints/sockets/scan.py", line 492, in scan_platforms
    scan_stats += await _identify_platform(
                  ^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<6 lines>...
    )
    ^
  File "/backend/endpoints/sockets/scan.py", line 402, in _identify_platform
    scan_stats += await _identify_rom(
                  ^^^^^^^^^^^^^^^^^^^^
    ...<7 lines>...
    )
    ^
  File "/backend/endpoints/sockets/scan.py", line 216, in _identify_rom
    scanned_rom = await scan_rom(
                  ^^^^^^^^^^^^^^^
    ...<6 lines>...
    )
    ^
  File "/backend/handler/scan_handler.py", line 501, in scan_rom
    ) = await asyncio.gather(
        ^^^^^^^^^^^^^^^^^^^^^
    ...<6 lines>...
    )
    ^
  File "/backend/handler/scan_handler.py", line 458, in fetch_ra_rom
    return await meta_ra_handler.get_rom_by_id(rom=rom, ra_id=h_ra_id)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/backend/handler/metadata/ra_handler.py", line 240, in get_rom_by_id
    rom_details = await self.ra_service.get_game_extended_details(ra_id)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/backend/adapters/services/retroachievements.py", line 118, in get_game_extended_details
    response = await self._request(str(url))
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/backend/adapters/services/retroachievements.py", line 68, in _request
    raise HTTPException(
    ...<2 lines>...
    ) from exc
fastapi.exceptions.HTTPException: 503: Can't connect to RetroAchievements, check your internet connection

INFO:     [RomM][server][2025-08-08 16:56:42] connection closed

Desktop (please complete the following information):

Not needed

Smartphone (please complete the following information):

Not needed

Server (I've added this)
It's Docker v28.3.3 + Docker Compose v2.39.1 on Ubuntu 24.04.2 LTS virtualized in Proxmox.

Additional context
Maybe it scans 400 roms and then stops, or scans 2000 then stops, or 10 then stops.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Fields

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions