node: Set TCP_KEEPALIVE on sockets
Ensures dead connections are not kept around longer than necessary. Note that the ping/pong mechanism is more expensive and checks that the session is active and healthy, while TCP_KEEPALIVE is lower level, cheaper, and checks that the connection is still alive.
This commit is contained in:
parent
90deb20405
commit
a85e7f7442
|
|
@ -2683,6 +2683,7 @@ dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"snapbox",
|
"snapbox",
|
||||||
|
"socket2",
|
||||||
"sqlite",
|
"sqlite",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@ scrypt = { version = "0.11.0", default-features = false }
|
||||||
serde = { version = "1", features = ["derive"] }
|
serde = { version = "1", features = ["derive"] }
|
||||||
serde_json = { version = "1", features = ["preserve_order"] }
|
serde_json = { version = "1", features = ["preserve_order"] }
|
||||||
snapbox = { version = "0.4.3", optional = true }
|
snapbox = { version = "0.4.3", optional = true }
|
||||||
|
socket2 = { version = "0.5.7" }
|
||||||
tempfile = { version = "3.3.0" }
|
tempfile = { version = "3.3.0" }
|
||||||
thiserror = { version = "1" }
|
thiserror = { version = "1" }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1181,8 +1181,17 @@ fn session<G: Signer + Ecdh<Pk = NodeId>>(
|
||||||
connection.set_read_timeout(Some(DEFAULT_CONNECTION_TIMEOUT))?;
|
connection.set_read_timeout(Some(DEFAULT_CONNECTION_TIMEOUT))?;
|
||||||
connection.set_write_timeout(Some(DEFAULT_CONNECTION_TIMEOUT))?;
|
connection.set_write_timeout(Some(DEFAULT_CONNECTION_TIMEOUT))?;
|
||||||
|
|
||||||
|
let sock = socket2::Socket::from(connection);
|
||||||
|
let ka = socket2::TcpKeepalive::new()
|
||||||
|
.with_time(time::Duration::from_secs(30))
|
||||||
|
.with_interval(time::Duration::from_secs(10))
|
||||||
|
.with_retries(3);
|
||||||
|
if let Err(e) = sock.set_tcp_keepalive(&ka) {
|
||||||
|
log::warn!(target: "wire", "Unable to set TCP_KEEPALIVE on fd {}: {e}", sock.as_raw_fd());
|
||||||
|
}
|
||||||
|
|
||||||
let socks5 = socks5::Socks5::with(remote_addr, force_proxy);
|
let socks5 = socks5::Socks5::with(remote_addr, force_proxy);
|
||||||
let proxy = Socks5Session::with(connection, socks5);
|
let proxy = Socks5Session::with(sock.into(), socks5);
|
||||||
let pair = G::generate_keypair();
|
let pair = G::generate_keypair();
|
||||||
let keyset = Keyset {
|
let keyset = Keyset {
|
||||||
e: pair.0,
|
e: pair.0,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue