util.go 633 B

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