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: warn on creating a tokio socket from a blocking one #7166

Open
wants to merge 19 commits into
base: master
Choose a base branch
from

Conversation

Noah-Kennedy
Copy link
Contributor

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

See #5595 and #7172.

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
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.


#[cfg(unix)]
#[allow(unused_variables)]
pub(crate) fn check_socket_for_blocking<S: AsFd>(s: &S) -> crate::io::Result<()> {
Copy link
Member

Choose a reason for hiding this comment

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

Why does this return io::Result? It doesn't seem like the fn needs a return argument.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

If the nonblocking check fails, propating the error seems the most straightforward response.

@@ -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
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