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

Always close BatchedSend write coroutines #6865

Merged
merged 1 commit into from
Aug 12, 2022

Conversation

gjoseph92
Copy link
Collaborator

From #6863 (comment).

@graingert I'm not sure my explanation of this is even close to correct. Please fix as appropriate.

Closes #6551

  • Tests added / passed
  • Passes pre-commit run --all-files

@gjoseph92 gjoseph92 requested a review from graingert August 10, 2022 00:26
@github-actions
Copy link
Contributor

Unit Test Results

See test report for an extended history of previous test failures. This is useful for diagnosing flaky tests.

       15 files  ±0         15 suites  ±0   6h 37m 27s ⏱️ - 4m 28s
  2 992 tests ±0    2 904 ✔️ +2       88 💤  - 1  0  - 1 
22 189 runs  ±0  21 141 ✔️ +7  1 048 💤  - 6  0  - 1 

Results for commit 9d302d7. ± Comparison against base commit e38d3a9.

@mrocklin
Copy link
Member

Nice green check mark 🙂

@fjetter fjetter mentioned this pull request Aug 11, 2022
@gjoseph92
Copy link
Collaborator Author

@graingert did I actually get the explanation right here? I don't feel like I did.

)
# NOTE: Since `BatchedSend` doesn't have a handle on the running
# `_background_send` coroutine, the only thing with a reference to this
# coroutine is the event loop itself. If the event loop stops while
Copy link
Member

@graingert graingert Aug 12, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this comment is correct, but it's missing an edge case, the event loop doesn't even keep a reference to the coro, necessarily.

it's loop._ready, loop._scheduled, loop._selector -> Handle -> Future.callback(self) -> Future._callbacks -> Task.__step(self), -> Task._coro

Highly recommend building a fun picture in objgraph of this ^

and when you call loop.close() it wipes out all the Handles in ready, scheduled and selector
however you can also create a Future wait on it in a Task and then lose the Future: boom the coro goes with it. running the finally block on whichever poor thread upset the garbage collector.

I don't think you should change the comment, but I think it's worth having this idea written down somewhere ^

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

actually on second thought maybe it is worth a change here, because maybe it explains why you can't fix this with yield asyncio.create_task(self.comm.write(...)). Or maybe It just depends on if the hammer falls before or after asyncio.get_running_loop() starts failing

@graingert
Copy link
Member

are there any other gen.coroutines we need to to fix?

@fjetter
Copy link
Member

fjetter commented Aug 12, 2022

are there any other gen.coroutines we need to to fix?

The only other critical path coroutine is TCP.close but I'm not sure if we can wrap this just as easily

afaik, all others are "only" tests / utils_test

@fjetter fjetter merged commit 2411d8f into dask:main Aug 12, 2022
@fjetter
Copy link
Member

fjetter commented Aug 12, 2022

Thanks @gjoseph92 and @graingert !

@gjoseph92 gjoseph92 deleted the batched-send-close-coroutine branch August 12, 2022 17:02
gjoseph92 added a commit to gjoseph92/distributed that referenced this pull request Oct 31, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
4 participants