diff --git a/ud/channelIDTracking.go b/ud/channelIDTracking.go index 5426b04facd821eeb064f8b344d8724fbf0e1e51..bf4d185fbf64aa62688e744a341cce64ae675bc7 100644 --- a/ud/channelIDTracking.go +++ b/ud/channelIDTracking.go @@ -232,6 +232,17 @@ func (c *clientIDTracker) Start() (stoppable.Stoppable, error) { return stopper, nil } +func pow(base, exponent int) int { + if exponent == 0 { + return 1 + } + result := base + for i := 2; i <= exponent; i++ { + result *= base + } + return result +} + // registrationWorker is meant to run in it's own goroutine // periodically registering, getting a new lease. func (c *clientIDTracker) registrationWorker(stopper *stoppable.Single) { @@ -244,12 +255,13 @@ func (c *clientIDTracker) registrationWorker(stopper *stoppable.Single) { if time.Now().After(c.registrationDisk.GetLease().Add(-graceDuration)) { err := c.register() if err != nil { - backoffSeconds := int(math.Pow(float64(base), float64(exponent))) + backoffSeconds := pow(base, exponent) if backoffSeconds > maxBackoff { backoffSeconds = maxBackoff + } else { + exponent += 1 } waitTime = time.Second * time.Duration(backoffSeconds) - exponent += 1 } }