galaxyproject / galaxyproject/galaxy

UnboundLocalError `/api/invocations/{invocation_id}/report`

Open
#17,871 1 comment 0 reactions 0 assignees View on GitHub
area/workflows kind/bug
Dominant language
Python
Stars
1.9k
Forks
1.2k
Avg merge
2d 16h
Merged PRs (30d)
169

Description

from https://sentry.galaxyproject.org/share/issue/6dc72d63eb67489f991e1ec5375eb16b/:

```
ExceptionGroup: unhandled errors in a TaskGroup
File "starlette/_utils.py", line 87, in collapse_excgroups
yield
File "starlette/middleware/base.py", line 190, in __call__
async with anyio.create_task_group() as task_group:
File "anyio/_backends/_asyncio.py", line 678, in __aexit__
raise BaseExceptionGroup(
UnboundLocalError: cannot access local variable 'ref_object' where it is not associated with a value
File "starlette/applications.py", line 123, in __call__
await self.middleware_stack(scope, receive, send)
File "starlette/middleware/errors.py", line 186, in __call__
raise exc
File "starlette/middleware/errors.py", line 164, in __call__
await self.app(scope, receive, _send)
File "starlette_context/middleware/raw_middleware.py", line 92, in __call__
await self.app(scope, receive, send_wrapper)
File "starlette/middleware/base.py", line 189, in __call__
with collapse_excgroups():
File "contextlib.py", line 155, in __exit__
self.gen.throw(typ, value, traceback)
File "starlette/_utils.py", line 93, in collapse_excgroups
raise exc
File "starlette/middleware/base.py", line 191, in __call__
response = await self.dispatch_func(request, call_next)
File "galaxy/webapps/galaxy/fast_app.py", line 108, in add_x_frame_options
response = await call_next(request)
File "starlette/middleware/base.py", line 165, in call_next
raise app_exc
File "starlette/middleware/base.py", line 151, in coro
await self.app(scope, receive_or_disconnect, send_no_error)
File "starlette/middleware/exceptions.py", line 62, in __call__
await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
File "starlette/_exception_handler.py", line 64, in wrapped_app
raise exc
File "starlette/_exception_handler.py", line 53, in wrapped_app
await app(scope, receive, sender)
File "starlette/routing.py", line 758, in __call__
await self.middleware_stack(scope, receive, send)
File "starlette/routing.py", line 778, in app
await route.handle(scope, receive, send)
File "starlette/routing.py", line 299, in handle
await self.app(scope, receive, send)
File "starlette/routing.py", line 79, in app
await wrap_app_handling_exceptions(app, request)(scope, receive, send)
File "starlette/_exception_handler.py", line 64, in wrapped_app
raise exc
File "starlette/_exception_handler.py", line 53, in wrapped_app
await app(scope, receive, sender)
File "starlette/routing.py", line 74, in app
response = await func(request)
File "fastapi/routing.py", line 278, in app
raw_response = await run_endpoint_function(
File "fastapi/routing.py", line 193, in run_endpoint_function
return await run_in_threadpool(dependant.call, **values)
File "starlette/concurrency.py", line 42, in run_in_threadpool
return await anyio.to_thread.run_sync(func, *args)
File "anyio/to_thread.py", line 56, in run_sync
return await get_async_backend().run_sync_in_worker_thread(
File "anyio/_backends/_asyncio.py", line 2144, in run_sync_in_worker_thread
return await future
File "anyio/_backends/_asyncio.py", line 851, in run
result = context.run(func, *args)
File "galaxy/webapps/galaxy/api/workflows.py", line 1482, in show_invocation_report
return self.invocations_service.show_invocation_report(trans, invocation_id)
File "galaxy/webapps/galaxy/services/invocations.py", line 143, in show_invocation_report
wfi_report = self._workflows_manager.get_invocation_report(trans, invocation_id, format=format)
File "galaxy/managers/workflows.py", line 426, in get_invocation_report
return generate_report(
File "galaxy/workflow/reports/__init__.py", line 14, in generate_report
return plugin.generate_report_json(trans, invocation, runtime_report_config_json=runtime_report_config_json)
File "galaxy/workflow/reports/generators/__init__.py", line 43, in generate_report_json
internal_markdown = self._generate_internal_markdown(
File "galaxy/workflow/reports/generators/__init__.py", line 73, in _generate_internal_markdown
internal_markdown = resolve_invocation_markdown(trans, invocation, workflow_markdown)
File "galaxy/managers/markdown_util.py", line 958, in resolve_invocation_markdown
galaxy_markdown = _remap_galaxy_markdown_calls(_remap, workflow_markdown)
File "galaxy/managers/markdown_util.py", line 1012, in _remap_galaxy_markdown_calls
return _remap_galaxy_markdown_containers(_remap_container, markdown)
File "galaxy/managers/markdown_util.py", line 971, in _remap_galaxy_markdown_containers
(replacement, whole_block) = func(replace)
File "galaxy/managers/markdown_util.py", line 1008, in _remap_container
return func(match.group(1), f"{matching_line}\n")
File "galaxy/managers/markdown_util.py", line 944, in _remap
if ref_object:
```

Contributor guide

Open the contributing guide

Research direction

Start in galaxy/managers/markdown_util.py at resolve_invocation_markdown and the _remap function around the reported ref_object access. Trace how the workflow report for /api/invocations/{invocation_id}/report reaches this path and identify the input that leaves ref_object unset. Done means the endpoint no longer raises UnboundLocalError for that case and the report is generated successfully.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
api, backend
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.