util.go 728 B

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