| OLD | NEW | 
| (Empty) |  | 
 |   1 // Copyright 2015 The Chromium Authors. All rights reserved. | 
 |   2 // Use of this source code is governed by a BSD-style license that can be | 
 |   3 // found in the LICENSE file. | 
 |   4  | 
 |   5 package retry | 
 |   6  | 
 |   7 import ( | 
 |   8         "io" | 
 |   9         "time" | 
 |  10 ) | 
 |  11  | 
 |  12 // Default defines the default retry parameters that should be used throughout | 
 |  13 // the program. It is fine to update this variable on start up. | 
 |  14 var Default = &Config{ | 
 |  15         10, | 
 |  16         100 * time.Millisecond, | 
 |  17         500 * time.Millisecond, | 
 |  18         5 * time.Second, | 
 |  19 } | 
 |  20  | 
 |  21 // Config defines the retry properties. | 
 |  22 type Config struct { | 
 |  23         MaxTries            int           // Maximum number of retries. | 
 |  24         SleepMax            time.Duration // Maximum duration of a single sleep. | 
 |  25         SleepBase           time.Duration // Base sleep duration. | 
 |  26         SleepMultiplicative time.Duration // Incremental sleep duration for each
     additional try. | 
 |  27 } | 
 |  28  | 
 |  29 // Do runs a Retriable, potentially retrying it multiple times. | 
 |  30 func (c *Config) Do(r Retriable) (err error) { | 
 |  31         defer func() { | 
 |  32                 if err2 := r.Close(); err == nil { | 
 |  33                         err = err2 | 
 |  34                 } | 
 |  35         }() | 
 |  36         for i := 0; i < c.MaxTries; i++ { | 
 |  37                 err = r.Do() | 
 |  38                 if _, ok := err.(Error); !ok { | 
 |  39                         return err | 
 |  40                 } | 
 |  41                 if i != c.MaxTries-1 { | 
 |  42                         s := c.SleepBase + time.Duration(i)*c.SleepMultiplicativ
    e | 
 |  43                         if s > c.SleepMax { | 
 |  44                                 s = c.SleepMax | 
 |  45                         } | 
 |  46                         time.Sleep(s) | 
 |  47                 } | 
 |  48         } | 
 |  49         return | 
 |  50 } | 
 |  51  | 
 |  52 // Error is an error that can be retried. | 
 |  53 type Error struct { | 
 |  54         Err error | 
 |  55 } | 
 |  56  | 
 |  57 func (e Error) Error() string { | 
 |  58         return e.Err.Error() | 
 |  59 } | 
 |  60  | 
 |  61 // Retriable is a task that can be retried. It is important that Do be | 
 |  62 // idempotent. | 
 |  63 type Retriable interface { | 
 |  64         io.Closer | 
 |  65         Do() error | 
 |  66 } | 
| OLD | NEW |