func (p *putter) retryPutPart(part *part) {
	defer p.wg.Done()
	var err error
	for i := 0; i < p.c.NTry; i++ {
		err = p.putPart(part)
		if err == nil {
			p.sp.give <- part.b
			part.b = nil
			return
		}
		logger.debugPrintf("Error on attempt %d: Retrying part: %d, Error: %s", i, part.PartNumber, err)
		time.Sleep(time.Duration(math.Exp2(float64(i))) * 100 * time.Millisecond) // exponential back-off
	}
	p.err = err
}
func (p *putter) retryPutPart(part *part) {
	defer p.wg.Done()
	var err error
	for i := 0; i < p.c.NTry; i++ {
		err = p.putPart(part)
		if err == nil {
			p.sp.give <- part.b
			part.b = nil
			return
		}
		logger.debugPrintf("Error on attempt %d: Retrying part: %d, Error: %s", i, part.PartNumber, err)
		time.Sleep(time.Duration(math.Exp2(float64(i))) * 100 * time.Millisecond) 
	}
	p.err = err
}
func ( p * putter ) retryPutPart ( part * part ) { defer p . wg . Done ( ) var err error for i := 0 ; i < p . c . NTry ; i ++ { err = p . putPart ( part ) if err == nil { p . sp . give <- part . b part . b = nil return } logger . debugPrintf ( " " , i , part . PartNumber , err ) time . Sleep ( time . Duration ( math . Exp2 ( float64 ( i ) ) ) * 100 * time . Millisecond ) // exponential back-off } p . err = err }
// Calls putPart up to nTry times to recover from transient errors.
Calls putPart up to nTry times to recover from transient errors .