-
Notifications
You must be signed in to change notification settings - Fork 237
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
TCP_NODELAY not being set on the socket #379
Comments
I am not able to naively reproduce using your exact sample code on my current machine:
I stepped through the code briefly and verified that libcurl was setting |
@sagebind My gut feel is that I'm doing something wrong locally since this would be a bigger bug otherwise that would have been noticed earlier. The only difference I can see in your example is that you are using |
I tried this on a fresh VM instance with the following spec:
I still get the behaviour described above. I'm trying to figure out how to force Debian to use IPv6 resolution. @sagebind which OS flavour are you on? |
My test was run on macOS 10.15.7. With libcurl 7.64.1. |
@sagebind Thanks for the details! I see the following behaviour on macOS 10.15.7 and libcurl 7.64.1. With system curlCargo.toml:
TCP_DELAY is set correctly with static-curlCargo.toml:
TCP_DELAY is not set. I see no difference in output from Can you also try this with the |
@tailrecur Great discovery! I ran your example with static void tcpnodelay(struct Curl_easy *data, curl_socket_t sockfd)
{
#if defined(TCP_NODELAY)
curl_socklen_t onoff = (curl_socklen_t) 1;
int level = IPPROTO_TCP;
#if !defined(CURL_DISABLE_VERBOSE_STRINGS)
char buffer[STRERROR_LEN];
#else
(void) data;
#endif
if(setsockopt(sockfd, level, TCP_NODELAY, (void *)&onoff,
sizeof(onoff)) < 0)
infof(data, "Could not set TCP_NODELAY: %s\n",
Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
#else
(void)data;
(void)sockfd;
#endif
} However, the |
It is also worth noting that looking for the |
@sagebind Thanks for the confirmation. Nice to know I wasn't dreaming this 😄
Nice to know. I was not too confident about relying on the debug logs in the original bug report and so wanted to independently confirm it with Thanks for the links to the curl code. I'll need to brush up on my C first to be able to tackle that. |
The `TCP_NODELAY` macro/constant was not being defined during compilation for the bundled libcurl build on Unix systems because `netinet/tcp.h` was not being included. It is difficult to verify that this is working properly without a debugger or strace. I've confirmed this fix on Linux and macOS. Also rearrange some of the defines to help keep the build script somewhat organized. Fixes #379.
* Fix TCP_NODELAY not defined for static builds on Unix The `TCP_NODELAY` macro/constant was not being defined during compilation for the bundled libcurl build on Unix systems because `netinet/tcp.h` was not being included. It is difficult to verify that this is working properly without a debugger or strace. I've confirmed this fix on Linux and macOS. Also rearrange some of the defines to help keep the build script somewhat organized. Fixes #379. * Linux-specific headers are unnecessary
Bump curl from 0.4.34 to 0.4.35 Bumps [curl](https://github.com/alexcrichton/curl-rust) from 0.4.34 to 0.4.35. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/alexcrichton/curl-rust/releases">curl's releases</a>.</em></p> <blockquote> <h2>0.4.35</h2> <h2>Added</h2> <ul> <li>Add some more fields to <code>Debug</code> for <code>Version</code> (<a href="https://github.com/alexcrichton/curl-rust/issues/368">#368</a>)</li> <li>Add <code>expect_100_timeout</code> option to mirror <a href="https://curl.se/libcurl/c/CURLOPT_EXPECT_100_TIMEOUT_MS.html"><code>CURLOPT_EXPECT_100_TIMEOUT_MS</code></a> (<a href="https://github.com/alexcrichton/curl-rust/issues/376">#376</a>)</li> <li>Add feature-gated support for <code>curl_easy_upkeep</code>, introduced in 7.62.0. Use the <code>upkeep_7_62_0</code> feature to enable this method. (<a href="https://github.com/alexcrichton/curl-rust/issues/378">#378</a>)</li> </ul> <h2>Fixed</h2> <ul> <li>Probe for OpenSSL certificates only once (<a href="https://github.com/alexcrichton/curl-rust/issues/362">#362</a>, <a href="https://github.com/alexcrichton/curl-rust/issues/363">#363</a>)</li> <li>Upgrade socket2 dependency to a version not making invalid assumptions about the memory layout of <code>std::net::SocketAddr</code>. (<a href="https://github.com/alexcrichton/curl-rust/issues/365">#365</a>)</li> <li>Fix debug formatting for <code>Events</code> struct (<a href="https://github.com/alexcrichton/curl-rust/issues/377">#377</a>)</li> <li>Fix <code>tcp_nodelay</code> not working for static builds on Unix (<a href="https://github.com/alexcrichton/curl-rust/issues/379">#379</a>, <a href="https://github.com/alexcrichton/curl-rust/issues/381">#381</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/alexcrichton/curl-rust/commit/e220da3c650ae6ea55c08591f36ead6d4a94f97e"><code>e220da3</code></a> Add support for zlib-ng (<a href="https://github.com/alexcrichton/curl-rust/issues/351">#351</a>)</li> <li>See full diff in <a href="https://github.com/alexcrichton/curl-rust/compare/curl-sys-0.4.34...curl-sys-0.4.35">compare view</a></li> </ul> </details> <br /> [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=curl&package-manager=cargo&previous-version=0.4.34&new-version=0.4.35)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting ``@dependabot` rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - ``@dependabot` rebase` will rebase this PR - ``@dependabot` recreate` will recreate this PR, overwriting any edits that have been made to it - ``@dependabot` merge` will merge this PR after your CI passes on it - ``@dependabot` squash and merge` will squash and merge this PR after your CI passes on it - ``@dependabot` cancel merge` will cancel a previously requested merge and block automerging - ``@dependabot` reopen` will reopen this PR if it is closed - ``@dependabot` close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually </details>
Hello,
I'm building a testing-tool on top of
isahc
and couldn't figure out some odd behaviour around the TCP connection as detailed here and here.I finally narrowed it to down to the TCP socket not having the option
TCP_NODELAY
set on it even though the Rust program explicity sets this. I usedstrace
and knetstat to verify this. I'm able to reproduce the issue locally with the following simple example:Setup:
OS: Debian 4.19.171-2
OpenSSL 1.1.1d
Cargo.toml:
Rust program:
Curl command(for comparison):
Note:
curl
hasTCP_NODELAY
on by default nowDifferences between
cargo run
andcurl
commandstdout
cargo run
curl
knetstat
cargo run
curl
strace
cargo run
curl
The
curl-rust
implementation here and here look the same as every other option and I've double-checked that the code121
is correct. I'm not sure why the options are not getting set on the socket though.Is my usage of
easy.tcp_nodelay(true)
incorrect in the sample program?Can you please try to reproduce this issue too?
/cc @sagebind (sort of related to sagebind/isahc#303)
The text was updated successfully, but these errors were encountered: