From 517a91de7556a050c074792d8491104287a5acd4 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Fri, 28 Feb 2020 13:38:45 -0800 Subject: [PATCH] derp/derphttp: fix reconnect behavior I broke it in today's 752146a70f1aab08. Added some comments to prevent recurrences. Signed-off-by: Brad Fitzpatrick --- derp/derphttp/derphttp_client.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/derp/derphttp/derphttp_client.go b/derp/derphttp/derphttp_client.go index 1ecfa34be..2059a12b7 100644 --- a/derp/derphttp/derphttp_client.go +++ b/derp/derphttp/derphttp_client.go @@ -214,7 +214,7 @@ func (c *Client) Send(dstKey key.Public, b []byte) error { return err } if err := client.Send(dstKey, b); err != nil { - c.Close() + c.closeForReconnect() } return err } @@ -226,7 +226,7 @@ func (c *Client) Recv(b []byte) (derp.ReceivedMessage, error) { } m, err := client.Recv(b) if err != nil { - c.Close() + c.closeForReconnect() } return m, err } @@ -242,12 +242,23 @@ func (c *Client) Close() error { return ErrClientClosed } c.closed = true + if c.netConn != nil { + c.netConn.Close() + } + return nil +} + +// closeForReconnect closes the underlying network connection and +// zeros out the client field so future calls to Connect will +// reconnect. +func (c *Client) closeForReconnect() { + c.mu.Lock() + defer c.mu.Unlock() if c.netConn != nil { c.netConn.Close() c.netConn = nil } c.client = nil - return nil } var ErrClientClosed = errors.New("derphttp.Client closed")