util.go 592 B

123456789101112131415161718192021222324
  1. package ncutils
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. // BackOff - back off any function while there is an error
  7. func BackOff(isExponential bool, maxTime int, f interface{}) (interface{}, error) {
  8. // maxTime seconds
  9. startTime := time.Now()
  10. sleepTime := time.Second
  11. for time.Now().Before(startTime.Add(time.Second * time.Duration(maxTime))) {
  12. if result, err := f.(func() (interface{}, error))(); err == nil {
  13. return result, nil
  14. }
  15. time.Sleep(sleepTime)
  16. if isExponential {
  17. sleepTime = sleepTime << 1
  18. }
  19. PrintLog("retrying...", 1)
  20. }
  21. return nil, fmt.Errorf("could not find result")
  22. }