Satisfy golint
Evan Huus
9 years ago
20 | 20 |
switch result {
|
21 | 21 |
case nil:
|
22 | 22 |
// success!
|
23 | |
case breaker.BreakerOpen:
|
|
23 |
case breaker.ErrBreakerOpen:
|
24 | 24 |
// our function wasn't run because the breaker was open
|
25 | 25 |
default:
|
26 | 26 |
// some other error
|
6 | 6 |
"time"
|
7 | 7 |
)
|
8 | 8 |
|
9 | |
// BreakerOpen is the error returned from Run() when the function is not executed
|
|
9 |
// ErrBreakerOpen is the error returned from Run() when the function is not executed
|
10 | 10 |
// because the breaker is currently open.
|
11 | |
var BreakerOpen = errors.New("circuit breaker is open")
|
|
11 |
var ErrBreakerOpen = errors.New("circuit breaker is open")
|
12 | 12 |
|
13 | 13 |
type state int
|
14 | 14 |
|
|
42 | 42 |
}
|
43 | 43 |
}
|
44 | 44 |
|
45 | |
// Run will either return BreakerOpen immediately if the circuit-breaker is
|
|
45 |
// Run will either return ErrBreakerOpen immediately if the circuit-breaker is
|
46 | 46 |
// already open, or it will run the given function and pass along its return
|
47 | 47 |
// value. It is safe to call Run concurrently on the same Breaker.
|
48 | 48 |
func (b *Breaker) Run(x func() error) error {
|
|
51 | 51 |
b.lock.RUnlock()
|
52 | 52 |
|
53 | 53 |
if state == open {
|
54 | |
return BreakerOpen
|
|
54 |
return ErrBreakerOpen
|
55 | 55 |
}
|
56 | 56 |
|
57 | 57 |
var panicValue interface{}
|
5 | 5 |
"time"
|
6 | 6 |
)
|
7 | 7 |
|
8 | |
var someError = errors.New("someError")
|
|
8 |
var errSomeError = errors.New("errSomeError")
|
9 | 9 |
|
10 | 10 |
func returnsError() error {
|
11 | |
return someError
|
|
11 |
return errSomeError
|
12 | 12 |
}
|
13 | 13 |
|
14 | 14 |
func returnsSuccess() error {
|
|
19 | 19 |
breaker := New(2, 1, 1*time.Second)
|
20 | 20 |
|
21 | 21 |
for i := 0; i < 5; i++ {
|
22 | |
if err := breaker.Run(returnsError); err != someError {
|
|
22 |
if err := breaker.Run(returnsError); err != errSomeError {
|
23 | 23 |
t.Error(err)
|
24 | 24 |
}
|
25 | 25 |
time.Sleep(1 * time.Second)
|
|
31 | 31 |
|
32 | 32 |
// three errors opens the breaker
|
33 | 33 |
for i := 0; i < 3; i++ {
|
34 | |
if err := breaker.Run(returnsError); err != someError {
|
|
34 |
if err := breaker.Run(returnsError); err != errSomeError {
|
35 | 35 |
t.Error(err)
|
36 | 36 |
}
|
37 | 37 |
}
|
38 | 38 |
|
39 | 39 |
// breaker is open
|
40 | 40 |
for i := 0; i < 5; i++ {
|
41 | |
if err := breaker.Run(returnsError); err != BreakerOpen {
|
|
41 |
if err := breaker.Run(returnsError); err != ErrBreakerOpen {
|
42 | 42 |
t.Error(err)
|
43 | 43 |
}
|
44 | 44 |
}
|
|
50 | 50 |
t.Error(err)
|
51 | 51 |
}
|
52 | 52 |
// error works, but re-opens immediately
|
53 | |
if err := breaker.Run(returnsError); err != someError {
|
|
53 |
if err := breaker.Run(returnsError); err != errSomeError {
|
54 | 54 |
t.Error(err)
|
55 | 55 |
}
|
56 | 56 |
// breaker is open
|
57 | |
if err := breaker.Run(returnsError); err != BreakerOpen {
|
|
57 |
if err := breaker.Run(returnsError); err != ErrBreakerOpen {
|
58 | 58 |
t.Error(err)
|
59 | 59 |
}
|
60 | 60 |
|
|
67 | 67 |
}
|
68 | 68 |
}
|
69 | 69 |
// error works
|
70 | |
if err := breaker.Run(returnsError); err != someError {
|
|
70 |
if err := breaker.Run(returnsError); err != errSomeError {
|
71 | 71 |
t.Error(err)
|
72 | 72 |
}
|
73 | 73 |
// breaker is still closed
|
|
89 | 89 |
switch result {
|
90 | 90 |
case nil:
|
91 | 91 |
// success!
|
92 | |
case BreakerOpen:
|
|
92 |
case ErrBreakerOpen:
|
93 | 93 |
// our function wasn't run because the breaker was open
|
94 | 94 |
default:
|
95 | 95 |
// some other error
|