From 7bb5f9a1e49c586a2b456797c99ad50791aa9d86 Mon Sep 17 00:00:00 2001 From: Emile Vauge Date: Fri, 19 Aug 2016 11:09:34 +0200 Subject: [PATCH] Add long job RetryBackoff --- utils/retry.go | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 utils/retry.go diff --git a/utils/retry.go b/utils/retry.go new file mode 100644 index 000000000..7ec100ee9 --- /dev/null +++ b/utils/retry.go @@ -0,0 +1,41 @@ +package utils + +import ( + "github.com/cenkalti/backoff" + "time" +) + +const ( + minLongJobInterval = 30 * time.Second +) + +// RetryNotifyJob calls notify function with the error and wait duration +// for each failed attempt before sleep. +func RetryNotifyJob(operation backoff.Operation, b backoff.BackOff, notify backoff.Notify) error { + var err error + var next time.Duration + + b.Reset() + for { + before := time.Now() + if err = operation(); err == nil { + return nil + } + elapsed := time.Since(before) + + // If long job, we reset the backoff + if elapsed >= minLongJobInterval { + b.Reset() + } + + if next = b.NextBackOff(); next == backoff.Stop { + return err + } + + if notify != nil { + notify(err, next) + } + + time.Sleep(next) + } +}