From 50ea0f36cf9e49f42b6baa13ddba1d462b6ba8e4 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Tue, 16 Feb 2021 15:52:48 +0800 Subject: [PATCH 1/2] enable TCP keepalives --- tcp.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tcp.go b/tcp.go index 03b2203..bb94997 100644 --- a/tcp.go +++ b/tcp.go @@ -22,6 +22,30 @@ var DefaultConnectTimeout = 5 * time.Second var log = logging.Logger("tcp-tpt") +const keepAlivePeriod = 30 * time.Second + +type canKeepAlive interface { + SetKeepAlive(bool) error + SetKeepAlivePeriod(time.Duration) error +} + +var _ canKeepAlive = &net.TCPConn{} + +func tryKeepAlive(conn net.Conn, keepAlive bool) { + keepAliveConn, ok := conn.(canKeepAlive) + if !ok { + log.Errorf("Can't set TCP keepalives.") + return + } + if err := keepAliveConn.SetKeepAlive(keepAlive); err != nil { + log.Errorf("Failed to enable TCP keepalive: %s", err) + return + } + if err := keepAliveConn.SetKeepAlivePeriod(keepAlivePeriod); err != nil { + log.Errorf("Failed set keepalive period: %s", err) + } +} + // try to set linger on the connection, if possible. func tryLinger(conn net.Conn, sec int) { type canLinger interface { @@ -44,6 +68,7 @@ func (ll *lingerListener) Accept() (manet.Conn, error) { return nil, err } tryLinger(c, ll.sec) + tryKeepAlive(c, true) return c, nil } @@ -106,6 +131,7 @@ func (t *TcpTransport) Dial(ctx context.Context, raddr ma.Multiaddr, p peer.ID) // linger is 0, connections are _reset_ instead of closed with a FIN. // This means we can immediately reuse the 5-tuple and reconnect. tryLinger(conn, 0) + tryKeepAlive(conn, true) return t.Upgrader.UpgradeOutbound(ctx, t, conn, p) } From 7b0f5394b17e8d3a3e17025f420849edd838e35b Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 24 Feb 2021 11:24:22 +0800 Subject: [PATCH 2/2] rename the lingerListener to tcpListener --- tcp.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tcp.go b/tcp.go index bb94997..95c30df 100644 --- a/tcp.go +++ b/tcp.go @@ -57,12 +57,12 @@ func tryLinger(conn net.Conn, sec int) { } } -type lingerListener struct { +type tcpListener struct { manet.Listener sec int } -func (ll *lingerListener) Accept() (manet.Conn, error) { +func (ll *tcpListener) Accept() (manet.Conn, error) { c, err := ll.Listener.Accept() if err != nil { return nil, err @@ -153,7 +153,7 @@ func (t *TcpTransport) Listen(laddr ma.Multiaddr) (transport.Listener, error) { if err != nil { return nil, err } - list = &lingerListener{list, 0} + list = &tcpListener{list, 0} return t.Upgrader.UpgradeListener(t, list), nil }