Codebase list golang-gopkg-eapache-go-resiliency.v1 / 918d57e
Satisfy golint Evan Huus 9 years ago
3 changed file(s) with 14 addition(s) and 14 deletion(s). Raw diff Collapse all Expand all
2020 switch result {
2121 case nil:
2222 // success!
23 case breaker.BreakerOpen:
23 case breaker.ErrBreakerOpen:
2424 // our function wasn't run because the breaker was open
2525 default:
2626 // some other error
66 "time"
77 )
88
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
1010 // because the breaker is currently open.
11 var BreakerOpen = errors.New("circuit breaker is open")
11 var ErrBreakerOpen = errors.New("circuit breaker is open")
1212
1313 type state int
1414
4242 }
4343 }
4444
45 // Run will either return BreakerOpen immediately if the circuit-breaker is
45 // Run will either return ErrBreakerOpen immediately if the circuit-breaker is
4646 // already open, or it will run the given function and pass along its return
4747 // value. It is safe to call Run concurrently on the same Breaker.
4848 func (b *Breaker) Run(x func() error) error {
5151 b.lock.RUnlock()
5252
5353 if state == open {
54 return BreakerOpen
54 return ErrBreakerOpen
5555 }
5656
5757 var panicValue interface{}
55 "time"
66 )
77
8 var someError = errors.New("someError")
8 var errSomeError = errors.New("errSomeError")
99
1010 func returnsError() error {
11 return someError
11 return errSomeError
1212 }
1313
1414 func returnsSuccess() error {
1919 breaker := New(2, 1, 1*time.Second)
2020
2121 for i := 0; i < 5; i++ {
22 if err := breaker.Run(returnsError); err != someError {
22 if err := breaker.Run(returnsError); err != errSomeError {
2323 t.Error(err)
2424 }
2525 time.Sleep(1 * time.Second)
3131
3232 // three errors opens the breaker
3333 for i := 0; i < 3; i++ {
34 if err := breaker.Run(returnsError); err != someError {
34 if err := breaker.Run(returnsError); err != errSomeError {
3535 t.Error(err)
3636 }
3737 }
3838
3939 // breaker is open
4040 for i := 0; i < 5; i++ {
41 if err := breaker.Run(returnsError); err != BreakerOpen {
41 if err := breaker.Run(returnsError); err != ErrBreakerOpen {
4242 t.Error(err)
4343 }
4444 }
5050 t.Error(err)
5151 }
5252 // error works, but re-opens immediately
53 if err := breaker.Run(returnsError); err != someError {
53 if err := breaker.Run(returnsError); err != errSomeError {
5454 t.Error(err)
5555 }
5656 // breaker is open
57 if err := breaker.Run(returnsError); err != BreakerOpen {
57 if err := breaker.Run(returnsError); err != ErrBreakerOpen {
5858 t.Error(err)
5959 }
6060
6767 }
6868 }
6969 // error works
70 if err := breaker.Run(returnsError); err != someError {
70 if err := breaker.Run(returnsError); err != errSomeError {
7171 t.Error(err)
7272 }
7373 // breaker is still closed
8989 switch result {
9090 case nil:
9191 // success!
92 case BreakerOpen:
92 case ErrBreakerOpen:
9393 // our function wasn't run because the breaker was open
9494 default:
9595 // some other error