diff --git a/Cargo.lock b/Cargo.lock index c770f576c9..bb27df7012 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -916,7 +916,7 @@ checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.10.0+wasi-snapshot-preview1", ] [[package]] @@ -1371,14 +1371,15 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba272f85fa0b41fc91872be579b3bbe0f56b792aa361a380eb669469f68dafb2" +checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9" dependencies = [ "libc", "log", "miow", "ntapi", + "wasi 0.11.0+wasi-snapshot-preview1", "winapi", ] @@ -1931,6 +1932,7 @@ dependencies = [ "scopeguard", "serde", "serde_json", + "socket2", "thiserror", "tokio", "tokio-postgres 0.7.1 (git+https://github.com/zenithdb/rust-postgres.git?rev=2949d98df52587d562986aad155dd4e889e408b7)", @@ -2609,7 +2611,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ "libc", - "wasi", + "wasi 0.10.0+wasi-snapshot-preview1", "winapi", ] @@ -3113,6 +3115,12 @@ version = "0.10.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "wasm-bindgen" version = "0.2.79" diff --git a/compute_tools/Cargo.toml b/compute_tools/Cargo.toml index 4ecf7f6499..56047093f1 100644 --- a/compute_tools/Cargo.toml +++ b/compute_tools/Cargo.toml @@ -16,5 +16,5 @@ regex = "1" serde = { version = "1.0", features = ["derive"] } serde_json = "1" tar = "0.4" -tokio = { version = "1", features = ["macros", "rt", "rt-multi-thread"] } +tokio = { version = "1.17", features = ["macros", "rt", "rt-multi-thread"] } workspace_hack = { version = "0.1", path = "../workspace_hack" } diff --git a/pageserver/Cargo.toml b/pageserver/Cargo.toml index 14eae31da8..6a77af1691 100644 --- a/pageserver/Cargo.toml +++ b/pageserver/Cargo.toml @@ -17,7 +17,7 @@ lazy_static = "1.4.0" log = "0.4.14" clap = "3.0" daemonize = "0.4.1" -tokio = { version = "1.11", features = ["process", "sync", "macros", "fs", "rt", "io-util", "time"] } +tokio = { version = "1.17", features = ["process", "sync", "macros", "fs", "rt", "io-util", "time"] } postgres-types = { git = "https://github.com/zenithdb/rust-postgres.git", rev="2949d98df52587d562986aad155dd4e889e408b7" } postgres-protocol = { git = "https://github.com/zenithdb/rust-postgres.git", rev="2949d98df52587d562986aad155dd4e889e408b7" } postgres = { git = "https://github.com/zenithdb/rust-postgres.git", rev="2949d98df52587d562986aad155dd4e889e408b7" } diff --git a/proxy/Cargo.toml b/proxy/Cargo.toml index 72c394dad4..dc20695884 100644 --- a/proxy/Cargo.toml +++ b/proxy/Cargo.toml @@ -22,8 +22,9 @@ rustls = "0.19.1" scopeguard = "1.1.0" serde = "1" serde_json = "1" +socket2 = "0.4.4" thiserror = "1.0" -tokio = { version = "1.11", features = ["macros"] } +tokio = { version = "1.17", features = ["macros"] } tokio-postgres = { git = "https://github.com/zenithdb/rust-postgres.git", rev="2949d98df52587d562986aad155dd4e889e408b7" } tokio-rustls = "0.22.0" diff --git a/proxy/src/compute.rs b/proxy/src/compute.rs index 64ce5d0a5a..7c0ab965a0 100644 --- a/proxy/src/compute.rs +++ b/proxy/src/compute.rs @@ -41,6 +41,7 @@ impl DatabaseInfo { let host_port = format!("{}:{}", self.host, self.port); let socket = TcpStream::connect(host_port).await?; let socket_addr = socket.peer_addr()?; + socket2::SockRef::from(&socket).set_keepalive(true)?; Ok((socket_addr, socket)) } diff --git a/proxy/src/proxy.rs b/proxy/src/proxy.rs index 3c7f59bc26..81581b5cf1 100644 --- a/proxy/src/proxy.rs +++ b/proxy/src/proxy.rs @@ -50,6 +50,10 @@ pub async fn thread_main( println!("proxy has shut down"); } + // When set for the server socket, the keepalive setting + // will be inherited by all accepted client sockets. + socket2::SockRef::from(&listener).set_keepalive(true)?; + let cancel_map = Arc::new(CancelMap::default()); loop { let (socket, peer_addr) = listener.accept().await?; @@ -367,4 +371,24 @@ mod tests { Ok(()) } + + #[tokio::test] + async fn keepalive_is_inherited() -> anyhow::Result<()> { + use tokio::net::{TcpListener, TcpStream}; + + let listener = TcpListener::bind("127.0.0.1:0").await?; + let port = listener.local_addr()?.port(); + socket2::SockRef::from(&listener).set_keepalive(true)?; + + let t = tokio::spawn(async move { + let (client, _) = listener.accept().await?; + let keepalive = socket2::SockRef::from(&client).keepalive()?; + anyhow::Ok(keepalive) + }); + + let _ = TcpStream::connect(("127.0.0.1", port)).await?; + assert!(t.await??, "keepalive should be inherited"); + + Ok(()) + } } diff --git a/walkeeper/Cargo.toml b/walkeeper/Cargo.toml index e8523d27d1..ddce78e737 100644 --- a/walkeeper/Cargo.toml +++ b/walkeeper/Cargo.toml @@ -15,7 +15,7 @@ tracing = "0.1.27" clap = "3.0" daemonize = "0.4.1" rust-s3 = { version = "0.28", default-features = false, features = ["no-verify-ssl", "tokio-rustls-tls"] } -tokio = { version = "1.11", features = ["macros"] } +tokio = { version = "1.17", features = ["macros"] } postgres-protocol = { git = "https://github.com/zenithdb/rust-postgres.git", rev="2949d98df52587d562986aad155dd4e889e408b7" } postgres = { git = "https://github.com/zenithdb/rust-postgres.git", rev="2949d98df52587d562986aad155dd4e889e408b7" } anyhow = "1.0" diff --git a/zenith_utils/Cargo.toml b/zenith_utils/Cargo.toml index e8ad0e627f..cf864b3a54 100644 --- a/zenith_utils/Cargo.toml +++ b/zenith_utils/Cargo.toml @@ -16,7 +16,7 @@ routerify = "3" serde = { version = "1.0", features = ["derive"] } serde_json = "1" thiserror = "1.0" -tokio = { version = "1.11", features = ["macros"]} +tokio = { version = "1.17", features = ["macros"]} tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } nix = "0.23.0"