helper/resource: RetryError for quitting quickly
This commit is contained in:
parent
10ce2b690c
commit
b4f8b7f43b
|
@ -18,14 +18,29 @@ func Retry(timeout time.Duration, f RetryFunc) error {
|
|||
MinTimeout: 500 * time.Millisecond,
|
||||
Refresh: func() (interface{}, string, error) {
|
||||
err = f()
|
||||
if err != nil {
|
||||
return 42, "error", nil
|
||||
if err == nil {
|
||||
return 42, "success", nil
|
||||
}
|
||||
|
||||
return 42, "success", nil
|
||||
if rerr, ok := err.(RetryError); ok {
|
||||
err = rerr.Err
|
||||
return nil, "quit", err
|
||||
}
|
||||
|
||||
return 42, "error", nil
|
||||
},
|
||||
}
|
||||
|
||||
c.WaitForState()
|
||||
return err
|
||||
}
|
||||
|
||||
// RetryError, if returned, will quit the retry immediately with the
|
||||
// Err.
|
||||
type RetryError struct {
|
||||
Err error
|
||||
}
|
||||
|
||||
func (e RetryError) Error() string {
|
||||
return e.Err.Error()
|
||||
}
|
||||
|
|
|
@ -37,3 +37,26 @@ func TestRetry_timeout(t *testing.T) {
|
|||
t.Fatal("should error")
|
||||
}
|
||||
}
|
||||
|
||||
func TestRetry_error(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
expected := fmt.Errorf("nope")
|
||||
f := func() error {
|
||||
return RetryError{expected}
|
||||
}
|
||||
|
||||
errCh := make(chan error)
|
||||
go func() {
|
||||
errCh <- Retry(1*time.Second, f)
|
||||
}()
|
||||
|
||||
select {
|
||||
case err := <-errCh:
|
||||
if err != expected {
|
||||
t.Fatalf("bad: %#v", err)
|
||||
}
|
||||
case <-time.After(5 * time.Second):
|
||||
t.Fatal("timeout")
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue