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

net: debug_assert on creating a tokio socket from a blocking one #7166

Merged
merged 23 commits into from
Mar 5, 2025

Conversation

Noah-Kennedy
Copy link
Contributor

@Noah-Kennedy Noah-Kennedy commented Feb 20, 2025

See #5595 and #7172.

This adds a debug assertion that checks that a supplied underlying std socket is set to nonblocking mode when constructing a tokio socket object from such an object.

This only works on unix.

@Noah-Kennedy
Copy link
Contributor Author

Windows does not support this, so it only works on unix for now.

@Noah-Kennedy Noah-Kennedy changed the title net: warn on creating a tokio socket from a nonblocking one. net: warn on creating a tokio socket from a nonblocking one Feb 20, 2025
@Darksonn Darksonn requested a review from carllerche February 20, 2025 08:00
@Darksonn Darksonn added A-tokio Area: The main tokio crate M-net Module: tokio/net labels Feb 20, 2025
@Noah-Kennedy Noah-Kennedy changed the title net: warn on creating a tokio socket from a nonblocking one net: warn on creating a tokio socket from a blocking one Feb 20, 2025
Copy link

@Ten0 Ten0 left a comment

Choose a reason for hiding this comment

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

Thanks for getting this to move forward!

Is from_std_set_nonblocking/from_std_assume_nonblocking still the long term plan?
image
Or will it instead be something where tokio sets it to nonblocking, like axum_server currently does?
Or will the panic be considered to be enough?

@Noah-Kennedy
Copy link
Contributor Author

Thanks for getting this to move forward!

Is from_std_set_nonblocking/from_std_assume_nonblocking still the long term plan? image Or will it instead be something where tokio sets it to nonblocking, like axum_server currently does? Or will the panic be considered to be enough?

I think there's a bit that needs figured out still about what we do going forward. The trouble with the prior suggestion is that we actually still have the issue of TryFrom to figure out - we can't exactly deprecate that, and we need to figure out whether what it's behavior will be.

I think our two long-term options here are going to be to either panic, or set the socket option silently, and there's good arguments to be made for both. There should also be something along the lines of from_std_unchecked or from_std_assume_nonblocking, of course.

Given that we either need to leave the footgun in TryFrom or make a behavioral change anyways, I don't think leaving from_std as is makes much sense.

@Noah-Kennedy Noah-Kennedy enabled auto-merge (squash) February 20, 2025 21:51
Copy link
Contributor

@Darksonn Darksonn left a comment

Choose a reason for hiding this comment

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

This also needs review from Carl before it can be merged.

@@ -5,6 +5,7 @@ cfg_not_wasi! {
use crate::net::{to_socket_addrs, ToSocketAddrs};
}

use crate::util::blocking_check::check_socket_for_blocking;
Copy link
Member

Choose a reason for hiding this comment

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

Very minor and not a needed change to merge, but IMO this check makes more sense in the net module.

@Noah-Kennedy
Copy link
Contributor Author

@carllerche @Darksonn I have updated the PR and addressed the feedback. This is ready for re-review.

Noah-Kennedy and others added 8 commits March 1, 2025 10:39
See #5595.

This adds a warning when constructing a tokio socket object from an underlying std socket that is not set to nonblocking mode.

This warning is likely to incrementally turn into a hard error in the future.
@Noah-Kennedy Noah-Kennedy requested a review from carllerche March 1, 2025 16:40
@Noah-Kennedy Noah-Kennedy changed the title net: warn on creating a tokio socket from a blocking one net: debug_assert on creating a tokio socket from a blocking one Mar 3, 2025
@Noah-Kennedy
Copy link
Contributor Author

from offline discussion with @Darksonn: need to wrap the lines on the docs to not be super long

this is good to merge after that is done

@Noah-Kennedy Noah-Kennedy disabled auto-merge March 4, 2025 01:44
@Noah-Kennedy Noah-Kennedy enabled auto-merge (squash) March 4, 2025 01:45
@Noah-Kennedy Noah-Kennedy disabled auto-merge March 4, 2025 01:45
@Noah-Kennedy Noah-Kennedy enabled auto-merge (squash) March 4, 2025 01:45
Copy link
Member

@carllerche carllerche left a comment

Choose a reason for hiding this comment

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

Small proposal for the panic message.

@Noah-Kennedy Noah-Kennedy disabled auto-merge March 5, 2025 02:30
@Noah-Kennedy Noah-Kennedy enabled auto-merge (squash) March 5, 2025 02:31
Copy link
Member

@carllerche carllerche left a comment

Choose a reason for hiding this comment

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

LGTM thanks

@Noah-Kennedy Noah-Kennedy merged commit 042433c into master Mar 5, 2025
83 checks passed
@Noah-Kennedy Noah-Kennedy deleted the noah/warnings branch March 5, 2025 18:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-tokio Area: The main tokio crate M-net Module: tokio/net
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants