From f5d49c5842169daa0de2f08509ae20ae8a3e1248 Mon Sep 17 00:00:00 2001 From: Teo Koon Peng Date: Wed, 27 Nov 2024 11:40:54 +0800 Subject: [PATCH 1/2] add exponential backoff when connection to server fails Signed-off-by: Teo Koon Peng --- src/go/cmd/http-relay-client/client/client.go | 51 +++++++++++-------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/src/go/cmd/http-relay-client/client/client.go b/src/go/cmd/http-relay-client/client/client.go index 325d5668..6ff7c7f8 100644 --- a/src/go/cmd/http-relay-client/client/client.go +++ b/src/go/cmd/http-relay-client/client/client.go @@ -718,31 +718,42 @@ func (c *Client) localProxy(remote, local *http.Client) error { relayURL := c.buildRelayURL() var req *pb.HttpRequest = nil - var err error = nil - deadline := time.Now().Add(5 * time.Second) - for time.Now().Before(deadline) { + exponentialBackoff := backoff.ExponentialBackOff{ + InitialInterval: time.Second, + RandomizationFactor: 0, + Multiplier: 1.5, + MaxInterval: 10 * time.Second, + MaxElapsedTime: 60 * time.Second, + Clock: backoff.SystemClock, + } + + err := backoff.RetryNotify(func() error { + var err error req, err = c.getRequest(remote, relayURL) - if err != nil { - if errors.Is(err, ErrTimeout) { - return err - } else if errors.Is(err, ErrForbidden) { - slog.Error("failed to authenticate to cloud-api, restarting", ilog.Err(err)) - os.Exit(1) - } else if errors.Is(err, syscall.ECONNREFUSED) { - slog.Warn("Failed to connect to relay server. Retrying.") - continue - } else { - return fmt.Errorf("failed to get request from relay: %v", err) - } - } else { - break + if errors.Is(err, ErrTimeout) { + return backoff.Permanent(err) } - } + return err + }, &exponentialBackoff, func(err error, _ time.Duration) { + if err == nil { + return + } + if errors.Is(err, ErrForbidden) { + slog.Error("failed to authenticate to cloud-api, restarting", ilog.Err(err)) + os.Exit(1) + } else if errors.Is(err, syscall.ECONNREFUSED) { + slog.Warn("Failed to connect to relay server. Retrying.") + return + } + }) if err != nil { - slog.Error("failed to connect to cloud-api, restarting", ilog.Err(err)) - os.Exit(1) + if pe, ok := err.(*backoff.PermanentError); ok { + return fmt.Errorf("failed to get request from relay: %v", pe.Err) + } else { + return err + } } // Forward the request to the backend. From a1a2ac3fc8204e831a38dc9c97eb7df952066e2c Mon Sep 17 00:00:00 2001 From: Teo Koon Peng Date: Mon, 2 Dec 2024 10:16:13 +0800 Subject: [PATCH 2/2] change initial interval to 100 ms; remove unneeded cast Signed-off-by: Teo Koon Peng --- src/go/cmd/http-relay-client/client/client.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/go/cmd/http-relay-client/client/client.go b/src/go/cmd/http-relay-client/client/client.go index 6ff7c7f8..d734176a 100644 --- a/src/go/cmd/http-relay-client/client/client.go +++ b/src/go/cmd/http-relay-client/client/client.go @@ -720,7 +720,7 @@ func (c *Client) localProxy(remote, local *http.Client) error { var req *pb.HttpRequest = nil exponentialBackoff := backoff.ExponentialBackOff{ - InitialInterval: time.Second, + InitialInterval: 100 * time.Millisecond, RandomizationFactor: 0, Multiplier: 1.5, MaxInterval: 10 * time.Second, @@ -749,11 +749,7 @@ func (c *Client) localProxy(remote, local *http.Client) error { }) if err != nil { - if pe, ok := err.(*backoff.PermanentError); ok { - return fmt.Errorf("failed to get request from relay: %v", pe.Err) - } else { - return err - } + return err } // Forward the request to the backend.