lemonyte / ferry-planner

BC Ferries sailing planner.
https://ferryplanner.ca
MIT License
3 stars 0 forks source link

RuntimeError: Event loop is closed #88

Open mikepal2 opened 3 months ago

mikepal2 commented 3 months ago

Reproduced on 127.0.0.1:8000/?origin=SWB&destination=PVB

INFO: 127.0.0.1:59821 - "POST /api/routeplans HTTP/1.1" 500 Internal Server Error ERROR: Exception in ASGI application Traceback (most recent call last): File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\uvicorn\protocols\http\httptools_impl.py", line 419, in run_asgi
result = await app( # type: ignore[func-returns-value] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\uvicorn\middleware\proxy_headers.py", line 84, in call return await self.app(scope, receive, send) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\fastapi\applications.py", line 1054, in call await super().call(scope, receive, send) File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\starlette\applications.py", line 123, in call await self.middleware_stack(scope, receive, send) File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\starlette\middleware\errors.py", line 186, in call raise exc File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\starlette\middleware\errors.py", line 164, in call await self.app(scope, receive, _send) File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\starlette\middleware\exceptions.py", line 62, in call await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\starlette_exception_handler.py", line 64, in wrapped_app raise exc File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\starlette_exception_handler.py", line 53, in wrapped_app await app(scope, receive, sender) File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\starlette\routing.py", line 758, in call await self.middleware_stack(scope, receive, send) File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\starlette\routing.py", line 778, in app await route.handle(scope, receive, send) File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\starlette\routing.py", line 299, in handle await self.app(scope, receive, send) File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\starlette\routing.py", line 79, in app await wrap_app_handling_exceptions(app, request)(scope, receive, send) File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\starlette_exception_handler.py", line 64, in wrapped_app raise exc File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\starlette_exception_handler.py", line 53, in wrapped_app await app(scope, receive, sender) File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\starlette\routing.py", line 74, in app response = await func(request) ^^^^^^^^^^^^^^^^^^^ File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\fastapi\routing.py", line 278, in app raw_response = await run_endpoint_function( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\fastapi\routing.py", line 191, in run_endpoint_function return await dependant.call(*values) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Mike\Sources\ferry-planner\src\ferry_planner\server.py", line 102, in api_routeplans await route_plan_builder.make_route_plans( File "C:\Users\Mike\Sources\ferry-planner\src\ferry_planner\route.py", line 283, in make_route_plans await self._pre_cache_schedules(routes=routes, options=options)
File "C:\Users\Mike\Sources\ferry-planner\src\ferry_planner\route.py", line 274, in _pre_cache_schedules await asyncio.gather(
tasks) File "C:\Users\Mike\Sources\ferry-planner\src\ferry_planner\schedule.py", line 168, in get schedule = await self.download_schedule(origin_id, destination_id, date=date) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Mike\Sources\ferry-planner\src\ferry_planner\schedule.py", line 194, in download_schedule return await self._download_schedule_async(origin_id, destination_id, date=date) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Mike\Sources\ferry-planner\src\ferry_planner\schedule.py", line 219, in _download_schedule_async response = await self._client.get(url) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\httpx_client.py", line 1801, in get return await self.request( ^^^^^^^^^^^^^^^^^^^ File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\httpx_client.py", line 1574, in request return await self.send(request, auth=auth, follow_redirects=follow_redirects) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\httpx_client.py", line 1661, in send response = await self._send_handling_auth( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\httpx_client.py", line 1689, in _send_handling_auth response = await self._send_handling_redirects( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\httpx_client.py", line 1726, in _send_handling_redirects response = await self._send_single_request(request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\httpx_client.py", line 1763, in _send_single_request response = await transport.handle_async_request(request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\httpx_transports\default.py", line 373, in handle_async_request
resp = await self._pool.handle_async_request(req) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\httpcore_async\connection_pool.py", line 216, in handle_async_request
raise exc from None File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\httpcore_async\connection_pool.py", line 189, in handle_async_request
await self._close_connections(closing) File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\httpcore_async\connection_pool.py", line 305, in _close_connections
await connection.aclose() File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\httpcore_async\connection.py", line 171, in aclose await self._connection.aclose() File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\httpcore_async\http11.py", line 265, in aclose await self._network_stream.aclose() File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\httpcore_backends\anyio.py", line 54, in aclose await self._stream.aclose() File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\anyio\streams\tls.py", line 202, in aclose await self.transport_stream.aclose() File "c:\Users\Mike\Sources\ferry-planner.venv\Lib\site-packages\anyio_backends_asyncio.py", line 1191, in aclose self._transport.close() File "C:\Users\Mike\AppData\Local\Programs\Python\Python311\Lib\asyncio\selector_events.py", line 864, in close self._loop.call_soon(self._call_connection_lost, None) File "C:\Users\Mike\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 762, in call_soon self._check_closed() File "C:\Users\Mike\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 520, in _check_closed raise RuntimeError('Event loop is closed') RuntimeError: Event loop is closed

mikepal2 commented 3 months ago

could be related https://stackoverflow.com/questions/61543406/asyncio-run-runtimeerror-event-loop-is-closed

mikepal2 commented 3 months ago

more here https://stackoverflow.com/questions/45600579/asyncio-event-loop-is-closed-when-getting-loop

mikepal2 commented 3 months ago

Repro 100% with cache_ahead_days: int = 3 on 127.0.0.1:8000/?origin=SWB&destination=PVB

it has something to do with [ScheduleDB:ERROR] failed to download schedule: TEX-CMX:2024-06-23 ScheduleDownloadError('error downloading https://www.bcferries.com/routes-fares/schedules/seasonal/TEX-CMX?&scheduleDate=06/23/2024: Date 2024-06-23 00:00:00 is out of seasonal schedules range')

once i added workaround for this schedule everything started to work fine

but we have to fix the underlying cause to prevent other download errors (timeouts?) to crash server