@@ -49,11 +49,13 @@ func (s *State) get() State {
4949 statePtr := (* int32 )(unsafe .Pointer (s ))
5050 return State (atomic .LoadInt32 (statePtr ))
5151}
52+
5253func (s * State ) set (update State ) {
5354 statePtr := (* int32 )(unsafe .Pointer (s ))
5455 newState := int32 (update )
5556 atomic .StoreInt32 (statePtr , newState )
5657}
58+
5759func (s * State ) casState (expect State , update State ) bool {
5860 statePtr := (* int32 )(unsafe .Pointer (s ))
5961 oldState := int32 (expect )
@@ -62,24 +64,29 @@ func (s *State) casState(expect State, update State) bool {
6264}
6365
6466type StateChangeListener interface {
65- OnChangeToClosed (prev State , rule Rule )
67+ // OnTransformToClosed is triggered when circuit breaker state transformed to Closed.
68+ OnTransformToClosed (prev State , rule Rule )
6669
67- OnChangeToOpen (prev State , rule Rule , snapshot interface {})
70+ // OnTransformToOpen is triggered when circuit breaker state transformed to Open.
71+ // The "snapshot" indicates the triggered value when the transformation occurs.
72+ OnTransformToOpen (prev State , rule Rule , snapshot interface {})
6873
69- OnChangeToHalfOpen (prev State , rule Rule )
74+ // OnTransformToHalfOpen is triggered when circuit breaker state transformed to HalfOpen.
75+ OnTransformToHalfOpen (prev State , rule Rule )
7076}
7177
7278type CircuitBreaker interface {
79+ // BoundRule returns the associated circuit breaking rule.
7380 BoundRule () Rule
74-
81+ // BoundStat returns the associated statistic data structure.
7582 BoundStat () interface {}
76-
83+ // TryPass acquires permission of an invocation only if it is available at the time of invocation.
7784 TryPass (ctx * base.EntryContext ) bool
78-
85+ // CurrentState returns current state of the circuit breaker.
7986 CurrentState () State
80- // HandleCompleted handle the entry completed, Will not call HandleCompleted if request is blocked.
81- // rt: the response time this entry cost .
82- HandleCompleted ( rt uint64 , err error )
87+ // OnRequestComplete record a completed request with the given response time as well as error (if present),
88+ // and handle state transformation of the circuit breaker .
89+ OnRequestComplete ( rtt uint64 , err error )
8390}
8491
8592//================================= circuitBreakerBase ====================================
@@ -106,54 +113,50 @@ func (b *circuitBreakerBase) updateNextRetryTimestamp() {
106113 atomic .StoreUint64 (& b .nextRetryTimestamp , util .CurrentTimeMillis ()+ uint64 (b .retryTimeoutMs ))
107114}
108115
109- // fromClosedToOpen update circuit breaker status machine from closed to open
110- // Used for opening circuit breaker from closed when checking circuit breaker
111- // return true if succeed to update
116+ // fromClosedToOpen updates circuit breaker state machine from closed to open.
117+ // Return true only if current goroutine successfully accomplished the transformation.
112118func (b * circuitBreakerBase ) fromClosedToOpen (snapshot interface {}) bool {
113119 if b .status .casState (Closed , Open ) {
114120 b .updateNextRetryTimestamp ()
115- for _ , listener := range statusSwitchListeners {
116- listener .OnChangeToOpen (Closed , b .rule , snapshot )
121+ for _ , listener := range stateChangeListeners {
122+ listener .OnTransformToOpen (Closed , b .rule , snapshot )
117123 }
118124 return true
119125 }
120126 return false
121127}
122128
123- // fromOpenToHalfOpen update circuit breaker status machine from open to half-open
124- // Used for probing
125- // return true if succeed to update
129+ // fromOpenToHalfOpen updates circuit breaker state machine from open to half-open.
130+ // Return true only if current goroutine successfully accomplished the transformation.
126131func (b * circuitBreakerBase ) fromOpenToHalfOpen () bool {
127132 if b .status .casState (Open , HalfOpen ) {
128- for _ , listener := range statusSwitchListeners {
129- listener .OnChangeToHalfOpen (Open , b .rule )
133+ for _ , listener := range stateChangeListeners {
134+ listener .OnTransformToHalfOpen (Open , b .rule )
130135 }
131136 return true
132137 }
133138 return false
134139}
135140
136- // fromHalfOpenToOpen update circuit breaker status machine from half-open to open
137- // Used for failing to probe
138- // return true if succeed to update
141+ // fromHalfOpenToOpen updates circuit breaker state machine from half-open to open.
142+ // Return true only if current goroutine successfully accomplished the transformation.
139143func (b * circuitBreakerBase ) fromHalfOpenToOpen (snapshot interface {}) bool {
140144 if b .status .casState (HalfOpen , Open ) {
141145 b .updateNextRetryTimestamp ()
142- for _ , listener := range statusSwitchListeners {
143- listener .OnChangeToOpen (HalfOpen , b .rule , snapshot )
146+ for _ , listener := range stateChangeListeners {
147+ listener .OnTransformToOpen (HalfOpen , b .rule , snapshot )
144148 }
145149 return true
146150 }
147151 return false
148152}
149153
150- // fromHalfOpenToOpen update circuit breaker status machine from half-open to closed
151- // Used for succeeding to probe
152- // return true if succeed to update
154+ // fromHalfOpenToOpen updates circuit breaker state machine from half-open to closed
155+ // Return true only if current goroutine successfully accomplished the transformation.
153156func (b * circuitBreakerBase ) fromHalfOpenToClosed () bool {
154157 if b .status .casState (HalfOpen , Closed ) {
155- for _ , listener := range statusSwitchListeners {
156- listener .OnChangeToClosed (HalfOpen , b .rule )
158+ for _ , listener := range stateChangeListeners {
159+ listener .OnTransformToClosed (HalfOpen , b .rule )
157160 }
158161 return true
159162 }
@@ -198,7 +201,7 @@ func (b *slowRtCircuitBreaker) BoundStat() interface{} {
198201 return b .stat
199202}
200203
201- // TryPass check circuit breaker based on status machine of circuit breaker.
204+ // TryPass check circuit breaker based on state machine of circuit breaker.
202205func (b * slowRtCircuitBreaker ) TryPass (_ * base.EntryContext ) bool {
203206 curStatus := b .CurrentState ()
204207 if curStatus == Closed {
@@ -212,7 +215,7 @@ func (b *slowRtCircuitBreaker) TryPass(_ *base.EntryContext) bool {
212215 return false
213216}
214217
215- func (b * slowRtCircuitBreaker ) HandleCompleted (rt uint64 , err error ) {
218+ func (b * slowRtCircuitBreaker ) OnRequestComplete (rt uint64 , err error ) {
216219 // add slow and add total
217220 metricStat := b .stat
218221 counter := metricStat .currentCounter ()
@@ -393,7 +396,7 @@ func (b *errorRatioCircuitBreaker) TryPass(_ *base.EntryContext) bool {
393396 return false
394397}
395398
396- func (b * errorRatioCircuitBreaker ) HandleCompleted (rt uint64 , err error ) {
399+ func (b * errorRatioCircuitBreaker ) OnRequestComplete (rt uint64 , err error ) {
397400 metricStat := b .stat
398401 counter := metricStat .currentCounter ()
399402 if err != nil {
@@ -570,7 +573,7 @@ func (b *errorCountCircuitBreaker) TryPass(_ *base.EntryContext) bool {
570573 return false
571574}
572575
573- func (b * errorCountCircuitBreaker ) HandleCompleted (rt uint64 , err error ) {
576+ func (b * errorCountCircuitBreaker ) OnRequestComplete (rt uint64 , err error ) {
574577 metricStat := b .stat
575578 counter := metricStat .currentCounter ()
576579 if err != nil {
0 commit comments