From 74485d3b13b4dd4aeca652e6a042846891253dfd Mon Sep 17 00:00:00 2001 From: Mikhail Bragin Date: Mon, 18 Oct 2021 13:29:26 +0200 Subject: [PATCH] fix: service hanging when error on startup has been encountered (#135) --- client/cmd/service_controller.go | 28 ++++++++++++++++++++++++++-- management/client/client.go | 2 +- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/client/cmd/service_controller.go b/client/cmd/service_controller.go index 816325907..ca20b4842 100644 --- a/client/cmd/service_controller.go +++ b/client/cmd/service_controller.go @@ -1,6 +1,7 @@ package cmd import ( + "github.com/cenkalti/backoff/v4" "github.com/kardianos/service" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" @@ -9,11 +10,32 @@ import ( ) func (p *program) Start(s service.Service) error { + + var backOff = &backoff.ExponentialBackOff{ + InitialInterval: time.Second, + RandomizationFactor: backoff.DefaultRandomizationFactor, + Multiplier: backoff.DefaultMultiplier, + MaxInterval: 30 * time.Second, + MaxElapsedTime: 24 * 3 * time.Hour, //stop after 3 days trying + Stop: backoff.Stop, + Clock: backoff.SystemClock, + } + // Start should not block. Do the actual work async. log.Info("starting service") //nolint go func() { - err := runClient() + operation := func() error { + err := runClient() + if err != nil { + log.Warnf("retrying Wiretrustee client app due to error: %v", err) + return err + } + return nil + } + + err := backoff.Retry(operation, backOff) if err != nil { + log.Errorf("exiting client retry loop due to unrecoverable error: %s", err) return } }() @@ -21,7 +43,9 @@ func (p *program) Start(s service.Service) error { } func (p *program) Stop(s service.Service) error { - stopCh <- 1 + go func() { + stopCh <- 1 + }() select { case <-cleanupCh: diff --git a/management/client/client.go b/management/client/client.go index 6d1c96f9e..902278bb4 100644 --- a/management/client/client.go +++ b/management/client/client.go @@ -45,7 +45,7 @@ func NewClient(ctx context.Context, addr string, ourPrivateKey wgtypes.Key, tlsE })) if err != nil { - log.Errorf("failed creating connection to Management Srvice %v", err) + log.Errorf("failed creating connection to Management Service %v", err) return nil, err }