From 117347ffaf740f5c96405029593bd026e61e241c Mon Sep 17 00:00:00 2001 From: David Stainton <dstainton@elixxir.io> Date: Fri, 26 Aug 2022 18:21:06 -0400 Subject: [PATCH] Improve exponential backoff --- ud/channelIDTracking.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/ud/channelIDTracking.go b/ud/channelIDTracking.go index 5426b04fa..bf4d185fb 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 } } -- GitLab