github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/conf/presets/retry.go (about)

     1  package presets
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/sirupsen/logrus"
     7  )
     8  
     9  type Retry struct {
    10  	Repeats  int
    11  	Interval time.Duration
    12  }
    13  
    14  func (r Retry) MarshalDefaults(v interface{}) {
    15  	if retry, ok := v.(*Retry); ok {
    16  		if retry.Repeats == 0 {
    17  			retry.Repeats = 3
    18  		}
    19  		if retry.Interval == 0 {
    20  			retry.Interval = 10 * time.Second
    21  		}
    22  	}
    23  }
    24  
    25  func (r Retry) Do(exec func() error) (err error) {
    26  	if r.Repeats <= 0 {
    27  		err = exec()
    28  		return
    29  	}
    30  	for i := 0; i < r.Repeats; i++ {
    31  		err = exec()
    32  		if err != nil {
    33  			logrus.Warningf("retry in seconds [%d]", r.Interval)
    34  			time.Sleep(r.Interval)
    35  		}
    36  	}
    37  	return
    38  }