code: func (g *Group) Do(ctx context.Context, key string, fn func(ctx context.Context) (interface{}, error)) (v interface{}, err error) {
  	var backoff time.Duration
  	for {
  		v, err = g.do(ctx, key, fn)
  		if err == nil || errors.Cause(err) != errRetry {
  			return v, err
  		}
  		// backoff logic
  		if backoff >= 3*time.Second {
  			err = errors.Wrapf(errRetryTimeout, "flightcontrol")
  			return v, err
  		}
  		runtime.Gosched()
  		if backoff > 0 {
  			time.Sleep(backoff)
  			backoff *= 2
  		} else {
  			backoff = time.Millisecond
  		}
  	}
  }
docs: // Do executes a context function syncronized by the key