Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

_rpc function cannot return generics #597

Closed
DiamondJoseph opened this issue Aug 20, 2024 · 0 comments · Fixed by #598
Closed

_rpc function cannot return generics #597

DiamondJoseph opened this issue Aug 20, 2024 · 0 comments · Fixed by #598
Assignees

Comments

@DiamondJoseph
Copy link
Contributor

DiamondJoseph commented Aug 20, 2024

To replicate, check out main and run blueapi serve then from the gui, use get_plans or get_devices. get_plans/plan_name works fine, as does get_devices/device_name, but the methods that return a list throw an exception during the _rpc method.

INFO:     127.0.0.1:52726 - "GET /devices HTTP/1.1" 500 Internal Server Error
ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 108, in __call__
    response = await self.dispatch_func(request, call_next)
  File "/home/qwe67581/Documents/work/blueapi/src/blueapi/service/main.py", line 343, in add_api_version_header
    response = await call_next(request)
  File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 84, in call_next
    raise app_exc
  File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 70, in coro
    await self.app(scope, receive_or_disconnect, send_no_error)
  File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/middleware/exceptions.py", line 79, in __call__
    raise exc
  File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/middleware/exceptions.py", line 68, in __call__
    await self.app(scope, receive, sender)
  File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/fastapi/middleware/asyncexitstack.py", line 20, in __call__
    raise e
  File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/fastapi/middleware/asyncexitstack.py", line 17, in __call__
    await self.app(scope, receive, send)
  File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/routing.py", line 718, in __call__
    await route.handle(scope, receive, send)
  File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/routing.py", line 276, in handle
    await self.app(scope, receive, send)
  File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/routing.py", line 66, in app
    response = await func(request)
  File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/fastapi/routing.py", line 241, in app
    raw_response = await run_endpoint_function(
  File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/fastapi/routing.py", line 169, in run_endpoint_function
    return await run_in_threadpool(dependant.call, **values)
  File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/concurrency.py", line 41, in run_in_threadpool
    return await anyio.to_thread.run_sync(func, *args)
  File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/anyio/to_thread.py", line 56, in run_sync
    return await get_async_backend().run_sync_in_worker_thread(
  File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/anyio/_backends/_asyncio.py", line 2177, in run_sync_in_worker_thread
    return await future
  File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/anyio/_backends/_asyncio.py", line 859, in run
    result = context.run(func, *args)
  File "/home/qwe67581/Documents/work/blueapi/src/blueapi/service/main.py", line 126, in get_devices
    return DeviceResponse(devices=runner.run(interface.get_devices))
  File "/home/qwe67581/Documents/work/blueapi/src/blueapi/service/runner.py", line 89, in run
    return self._run_in_subprocess(function, *args, **kwargs)
  File "/home/qwe67581/Documents/work/blueapi/src/blueapi/service/runner.py", line 110, in _run_in_subprocess
    return self._subprocess.apply(
  File "/usr/lib/python3.10/multiprocessing/pool.py", line 360, in apply
    return self.apply_async(func, args, kwds).get()
  File "/usr/lib/python3.10/multiprocessing/pool.py", line 774, in get
    raise self._value
TypeError: isinstance() argument 2 cannot be a parameterized generic

During handling of the above exception, another exception occurred:

  + Exception Group Traceback (most recent call last):
  |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/uvicorn/protocols/http/httptools_impl.py", line 399, in run_asgi
  |     result = await app(  # type: ignore[func-returns-value]
  |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/uvicorn/middleware/proxy_headers.py", line 70, in __call__
  |     return await self.app(scope, receive, send)
  |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/fastapi/applications.py", line 290, in __call__
  |     await super().__call__(scope, receive, send)
  |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/applications.py", line 122, in __call__
  |     await self.middleware_stack(scope, receive, send)
  |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/middleware/errors.py", line 184, in __call__
  |     raise exc
  |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/middleware/errors.py", line 162, in __call__
  |     await self.app(scope, receive, _send)
  |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 106, in __call__
  |     async with anyio.create_task_group() as task_group:
  |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/anyio/_backends/_asyncio.py", line 680, in __aexit__
  |     raise BaseExceptionGroup(
  | exceptiongroup.ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
  +-+---------------- 1 ----------------
    | multiprocessing.pool.RemoteTraceback: 
    | """
    | Traceback (most recent call last):
    |   File "/usr/lib/python3.10/multiprocessing/pool.py", line 125, in worker
    |     result = (True, func(*args, **kwds))
    |   File "/home/qwe67581/Documents/work/blueapi/src/blueapi/service/runner.py", line 146, in _rpc
    |     if expected_type is None or isinstance(value, expected_type):
    | TypeError: isinstance() argument 2 cannot be a parameterized generic
    | """
    | 
    | The above exception was the direct cause of the following exception:
    | 
    | Traceback (most recent call last):
    |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 108, in __call__
    |     response = await self.dispatch_func(request, call_next)
    |   File "/home/qwe67581/Documents/work/blueapi/src/blueapi/service/main.py", line 343, in add_api_version_header
    |     response = await call_next(request)
    |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 84, in call_next
    |     raise app_exc
    |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/middleware/base.py", line 70, in coro
    |     await self.app(scope, receive_or_disconnect, send_no_error)
    |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/middleware/exceptions.py", line 79, in __call__
    |     raise exc
    |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/middleware/exceptions.py", line 68, in __call__
    |     await self.app(scope, receive, sender)
    |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/fastapi/middleware/asyncexitstack.py", line 20, in __call__
    |     raise e
    |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/fastapi/middleware/asyncexitstack.py", line 17, in __call__
    |     await self.app(scope, receive, send)
    |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/routing.py", line 718, in __call__
    |     await route.handle(scope, receive, send)
    |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/routing.py", line 276, in handle
    |     await self.app(scope, receive, send)
    |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/routing.py", line 66, in app
    |     response = await func(request)
    |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/fastapi/routing.py", line 241, in app
    |     raw_response = await run_endpoint_function(
    |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/fastapi/routing.py", line 169, in run_endpoint_function
    |     return await run_in_threadpool(dependant.call, **values)
    |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/starlette/concurrency.py", line 41, in run_in_threadpool
    |     return await anyio.to_thread.run_sync(func, *args)
    |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/anyio/to_thread.py", line 56, in run_sync
    |     return await get_async_backend().run_sync_in_worker_thread(
    |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/anyio/_backends/_asyncio.py", line 2177, in run_sync_in_worker_thread
    |     return await future
    |   File "/home/qwe67581/Documents/work/blueapi/venv/lib/python3.10/site-packages/anyio/_backends/_asyncio.py", line 859, in run
    |     result = context.run(func, *args)
    |   File "/home/qwe67581/Documents/work/blueapi/src/blueapi/service/main.py", line 126, in get_devices
    |     return DeviceResponse(devices=runner.run(interface.get_devices))
    |   File "/home/qwe67581/Documents/work/blueapi/src/blueapi/service/runner.py", line 89, in run
    |     return self._run_in_subprocess(function, *args, **kwargs)
    |   File "/home/qwe67581/Documents/work/blueapi/src/blueapi/service/runner.py", line 110, in _run_in_subprocess
    |     return self._subprocess.apply(
    |   File "/usr/lib/python3.10/multiprocessing/pool.py", line 360, in apply
    |     return self.apply_async(func, args, kwds).get()
    |   File "/usr/lib/python3.10/multiprocessing/pool.py", line 774, in get
    |     raise self._value
    | TypeError: isinstance() argument 2 cannot be a parameterized generic
    +------------------------------------
INFO:     127.0.0.1:48068 - "GET /devices/foo HTTP/1.1" 404 Not Found
INFO:     127.0.0.1:37548 - "GET /devices/sample_pressure HTTP/1.1" 200 OK
@DiamondJoseph DiamondJoseph self-assigned this Aug 20, 2024
DiamondJoseph added a commit that referenced this issue Aug 29, 2024
Closes #597

---------

Co-authored-by: Callum Forrester <callum.forrester@diamond.ac.uk>
ZohebShaikh pushed a commit that referenced this issue Aug 29, 2024
Closes #597

---------

Co-authored-by: Callum Forrester <callum.forrester@diamond.ac.uk>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant