CircuitBreaker transition into next states only when previous state aligns with what has been read #1064
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This should make sure the following outcomes happen
Thread 1 calls
Failure()
:previousState
asDisarmed
.Disarmed
toArmed
usingInterlocked.CompareExchange
.armedAction()
and starts the timer.Thread 2 calls
Success()
:previousState
asArmed
(if Thread 1 has already changed it).Armed
toDisarmed
usingInterlocked.CompareExchange
.disarmedAction()
and stops the timer.Possible Outcomes:
previousState
asArmed
and successfully disarms the circuit breaker.previousState
asDisarmed
and returns early without doing anything.Additionally, this PR synchronizes access to updating the processor processing capacity because armed and disarmed actions can potentially be executed concurrently. Setting concurrency and prefetch count is thread safe in the SDK, but we want to make sure the processor state updates are done consistently.