fix: improve keepalive

This commit is contained in:
Yujia Qiao 2022-01-01 23:52:03 +08:00
parent 4a1da9be7f
commit 8d2dc65a1d
No known key found for this signature in database
GPG Key ID: DC129173B148701B
4 changed files with 21 additions and 22 deletions

View File

@ -8,17 +8,27 @@ use std::{
use anyhow::{Context, Result};
use socket2::{SockRef, TcpKeepalive};
use tokio::net::{TcpStream, ToSocketAddrs, UdpSocket};
use tracing::error;
// Tokio hesitates to expose this option...So we have to do it on our own :(
// The good news is that using socket2 it can be easily done, without losing portablity.
// See https://github.com/tokio-rs/tokio/issues/3082
pub fn set_tcp_keepalive(conn: &TcpStream) -> Result<()> {
pub fn try_set_tcp_keepalive(conn: &TcpStream) -> Result<()> {
let s = SockRef::from(conn);
let keepalive = TcpKeepalive::new().with_time(Duration::from_secs(60));
s.set_tcp_keepalive(&keepalive)
.with_context(|| "Failed to set keepalive")
}
pub fn set_tcp_keepalive(conn: &TcpStream) {
if let Err(e) = try_set_tcp_keepalive(conn) {
error!(
"Failed to set TCP keepalive. The connection maybe unstable: {:?}",
e
);
}
}
#[allow(dead_code)]
pub fn feature_not_compile(feature: &str) -> ! {
panic!(

View File

@ -9,7 +9,6 @@ use anyhow::{anyhow, Context, Result};
use async_trait::async_trait;
use snowstorm::{Builder, NoiseParams, NoiseStream};
use tokio::net::{TcpListener, TcpStream, ToSocketAddrs};
use tracing::error;
pub struct NoiseTransport {
config: NoiseConfig,
@ -74,18 +73,16 @@ impl Transport for NoiseTransport {
async fn accept(&self, a: &Self::Acceptor) -> Result<(Self::Stream, SocketAddr)> {
let (conn, addr) = a.accept().await?;
set_tcp_keepalive(&conn);
let conn = NoiseStream::handshake(conn, self.builder().build_responder()?).await?;
Ok((conn, addr))
}
async fn connect(&self, addr: &str) -> Result<Self::Stream> {
let conn = TcpStream::connect(addr).await?;
if let Err(e) = set_tcp_keepalive(&conn) {
error!(
"Failed to set TCP keepalive. The connection maybe unstable: {:?}",
e
);
}
set_tcp_keepalive(&conn);
let conn = NoiseStream::handshake(conn, self.builder().build_initiator()?).await?;
return Ok(conn);
}

View File

@ -6,7 +6,6 @@ use anyhow::Result;
use async_trait::async_trait;
use std::net::SocketAddr;
use tokio::net::{TcpListener, TcpStream, ToSocketAddrs};
use tracing::error;
#[derive(Debug)]
pub struct TcpTransport {}
@ -26,17 +25,13 @@ impl Transport for TcpTransport {
async fn accept(&self, a: &Self::Acceptor) -> Result<(Self::Stream, SocketAddr)> {
let (s, addr) = a.accept().await?;
set_tcp_keepalive(&s);
Ok((s, addr))
}
async fn connect(&self, addr: &str) -> Result<Self::Stream> {
let s = TcpStream::connect(addr).await?;
if let Err(e) = set_tcp_keepalive(&s) {
error!(
"Failed to set TCP keepalive. The connection maybe unstable: {:?}",
e
);
}
set_tcp_keepalive(&s);
Ok(s)
}
}

View File

@ -9,7 +9,6 @@ use tokio::fs;
use tokio::net::{TcpListener, TcpStream, ToSocketAddrs};
use tokio_native_tls::native_tls::{self, Certificate, Identity};
use tokio_native_tls::{TlsAcceptor, TlsConnector, TlsStream};
use tracing::error;
#[derive(Debug)]
pub struct TlsTransport {
@ -66,6 +65,8 @@ impl Transport for TlsTransport {
async fn accept(&self, a: &Self::Acceptor) -> Result<(Self::Stream, SocketAddr)> {
let (conn, addr) = a.0.accept().await?;
set_tcp_keepalive(&conn);
let conn = a.1.accept(conn).await?;
Ok((conn, addr))
@ -73,12 +74,8 @@ impl Transport for TlsTransport {
async fn connect(&self, addr: &str) -> Result<Self::Stream> {
let conn = TcpStream::connect(&addr).await?;
if let Err(e) = set_tcp_keepalive(&conn) {
error!(
"Failed to set TCP keepalive. The connection maybe unstable: {:?}",
e
);
}
set_tcp_keepalive(&conn);
let connector = self.connector.as_ref().unwrap();
Ok(connector
.connect(