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

asyncio exception handler called with incorrect context #96704

Closed
kumaraditya303 opened this issue Sep 9, 2022 · 3 comments
Closed

asyncio exception handler called with incorrect context #96704

kumaraditya303 opened this issue Sep 9, 2022 · 3 comments
Assignees
Labels
3.10 only security fixes 3.11 only security fixes 3.12 bugs and security fixes topic-asyncio type-bug An unexpected behavior, bug, or error

Comments

@kumaraditya303
Copy link
Contributor

Reproducer:

import asyncio
import contextvars

name = contextvars.ContextVar('name', default='foo')


def exc_handler(*args):
    assert name.get() == 'bar'


async def task():
    name.set('bar')
    1/0


async def main():
    loop = asyncio.get_running_loop()
    loop.set_exception_handler(exc_handler)
    asyncio.create_task(task())

asyncio.run(main())

On main:

Unhandled error in exception handler
context: {'message': 'Task exception was never retrieved', 'exception': ZeroDivisionError('division by zero'), 'future': <Task finished name='Task-2' coro=<task() done, defined at /workspaces/cpython/main.py:11> exception=ZeroDivisionError('division by zero')>}
Traceback (most recent call last):
  File "/workspaces/cpython/Lib/asyncio/base_events.py", line 1797, in call_exception_handler
    self._exception_handler(self, context)
  File "/workspaces/cpython/main.py", line 8, in exc_handler
    assert name.get() == 'bar'
AssertionError

The exception handler is called with incorrect context hence the AssertionError. It should called with the same context as the task.
My use case is retrieving the current request id from the context var if there are any unhandled error but because of this bug, I always get the default value.

@kumaraditya303 kumaraditya303 added type-bug An unexpected behavior, bug, or error topic-asyncio 3.11 only security fixes 3.10 only security fixes 3.12 bugs and security fixes labels Sep 9, 2022
@gvanrossum
Copy link
Member

Maybe you can retrieve the task from the dict arg to the handler and use its ‘_context’ attribute? Or maybe we need to add a ‘get_context()’ method to Task? That’s a complex API change b/c custom task implementations though. Otherwise the implementation seems far from easy, given how many places call this?

@kumaraditya303
Copy link
Contributor Author

I only care about correct context in the task finalizer so that exception handler is called with correct context. I don't want to rely on any private attribute and it can change.

@gvanrossum
Copy link
Member

Your wish is my command. :-) (Sorry if you had a PR already, if you did we can compare notes, if you didn't you can review mine. :-)

gvanrossum added a commit to gvanrossum/cpython that referenced this issue Oct 4, 2022
gvanrossum added a commit that referenced this issue Oct 5, 2022
…andler() (#96756)

Co-authored-by: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com>
carljm added a commit to carljm/cpython that referenced this issue Oct 6, 2022
* main: (66 commits)
  pythongh-65961: Raise `DeprecationWarning` when `__package__` differs from `__spec__.parent` (python#97879)
  docs(typing): add "see PEP 675" to LiteralString (python#97926)
  pythongh-97850: Remove all known instances of module_repr() (python#97876)
  I changed my surname early this year (python#96671)
  pythongh-93738: Documentation C syntax (:c:type:<C type> -> :c:expr:<C type>) (python#97768)
  pythongh-91539: improve performance of get_proxies_environment  (python#91566)
  build(deps): bump actions/stale from 5 to 6 (python#97701)
  pythonGH-95172 Make the same version `versionadded` oneline (python#95172)
  pythongh-88050: Fix asyncio subprocess to kill process cleanly when process is blocked (python#32073)
  pythongh-93738: Documentation C syntax (Function glob patterns -> literal markup) (python#97774)
  pythongh-93357: Port test cases to IsolatedAsyncioTestCase, part 2 (python#97896)
  pythongh-95196: Disable incorrect pickling of the C implemented classmethod descriptors (pythonGH-96383)
  pythongh-97758: Fix a crash in getpath_joinpath() called without arguments (pythonGH-97759)
  pythongh-74696: Pass root_dir to custom archivers which support it (pythonGH-94251)
  pythongh-97661: Improve accuracy of sqlite3.Cursor.fetchone docs (python#97662)
  pythongh-87092: bring compiler code closer to a preprocessing-opt-assembler organisation (pythonGH-97644)
  pythonGH-96704: Add {Task,Handle}.get_context(), use it in call_exception_handler() (python#96756)
  pythongh-93738: Documentation C syntax (:c:type:`PyTypeObject*` -> :c:expr:`PyTypeObject*`) (python#97778)
  pythongh-97825: fix AttributeError when calling subprocess.check_output(input=None) with encoding or errors args (python#97826)
  Add re.VERBOSE flag documentation example (python#97678)
  ...
mpage pushed a commit to mpage/cpython that referenced this issue Oct 11, 2022
…tion_handler() (python#96756)

Co-authored-by: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
3.10 only security fixes 3.11 only security fixes 3.12 bugs and security fixes topic-asyncio type-bug An unexpected behavior, bug, or error
Projects
Status: Done
Development

No branches or pull requests

2 participants