diff --git a/internal/publicip/loop.go b/internal/publicip/loop.go index 3a3a76c3..2cca9c46 100644 --- a/internal/publicip/loop.go +++ b/internal/publicip/loop.go @@ -40,6 +40,7 @@ type Loop struct { stopped chan struct{} updateTicker chan struct{} backoffTime time.Duration + userTrigger bool // Mock functions timeNow func() time.Time } @@ -66,11 +67,12 @@ func NewLoop(client *http.Client, logger logging.Logger, logger: logger, puid: puid, pgid: pgid, - start: make(chan struct{}), - running: make(chan models.LoopStatus), - stop: make(chan struct{}), - stopped: make(chan struct{}), - updateTicker: make(chan struct{}), + start: start, + running: running, + stop: stop, + stopped: stopped, + updateTicker: updateTicker, + userTrigger: true, backoffTime: defaultBackoffTime, timeNow: time.Now, } diff --git a/internal/publicip/runner.go b/internal/publicip/runner.go index ae5c77dd..00514e65 100644 --- a/internal/publicip/runner.go +++ b/internal/publicip/runner.go @@ -15,8 +15,6 @@ type Runner interface { func (l *Loop) Run(ctx context.Context, done chan<- struct{}) { defer close(done) - crashed := false - select { case <-l.start: case <-ctx.Done(): @@ -40,10 +38,10 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) { ipCh <- ip }() - if !crashed { + if l.userTrigger { + l.userTrigger = false l.running <- constants.Running - crashed = false - } else { + } else { // crash l.backoffTime = defaultBackoffTime l.statusManager.SetStatus(constants.Running) } @@ -61,9 +59,11 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) { } return case <-l.start: + l.userTrigger = true getCancel() stayHere = false case <-l.stop: + l.userTrigger = true l.logger.Info("stopping") getCancel() <-errorCh @@ -92,7 +92,6 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) { close(ipCh) l.statusManager.SetStatus(constants.Crashed) l.logAndWait(ctx, err) - crashed = true stayHere = false } }