Пример #1
0
        public void HalfOpen()
        {
            State   = CircuitStatus.HalfOpen;
            Success = 0;

            OnStatusChanged(new NewCircuitStatus(State));
        }
Пример #2
0
 public CircuitBreaker(int maxErrors, int maxSuccess, TimeSpan circuitReset)
 {
     State        = CircuitStatus.Closed;
     MaxErrors    = maxErrors;
     MaxSuccess   = maxSuccess;
     CircuitReset = circuitReset;
 }
Пример #3
0
        public void Open(string reason)
        {
            State    = CircuitStatus.Open;
            OpenedAt = DateTime.UtcNow;

            OnStatusChanged(new NewCircuitStatus(State, reason));
        }
Пример #4
0
        public void Close()
        {
            Errors = 0;
            State  = CircuitStatus.Closed;

            OnStatusChanged(new NewCircuitStatus(State));
        }
Пример #5
0
 public CircuitStatus MarkSkipped()
 {
     _state = _state switch
     {
         // treat it as a success, so we can start testing logs
         CircuitStatus.Broken => CircuitStatus.HalfBroken,
         // otherwise, leave things as they are
         _ => _state,
     };
     return(_state);
 }
Пример #6
0
 public void SetFail(DateTime when)
 {
     lastFail = when;
     if (status == CircuitStatus.Closed)
     {
         status = CircuitStatus.HalfOpen;
     }
     else if (status == CircuitStatus.HalfOpen)
     {
         status = CircuitStatus.Open;
     }
 }
        internal void SkipDoesntChangeStatus_ExceptForBroken(CircuitStatus status)
        {
            TryEnterState(status);

            if (status == CircuitStatus.Broken)
            {
                _circuitBreaker.MarkSkipped().Should().Be(CircuitStatus.HalfBroken);
            }
            else
            {
                _circuitBreaker.MarkSkipped().Should().Be(status);
            }
        }
Пример #8
0
        public CircuitStatus MarkFailure()
        {
            _consecutiveFailureCount++;

            _state = _state switch
            {
                CircuitStatus.HalfBroken => CircuitStatus.Broken,
                _ when !_hasEverSucceeded && _consecutiveFailureCount >= _failuresBeforeBroken => CircuitStatus.PermanentlyBroken,
                _ when _consecutiveFailureCount >= _failuresBeforeBroken => CircuitStatus.Broken,
                _ => _state,
            };

            return(_state);
        }
Пример #9
0
        public CircuitStatus MarkSuccess()
        {
            _hasEverSucceeded        = true;
            _consecutiveFailureCount = 0;

            _state = _state switch
            {
                CircuitStatus.HalfBroken => CircuitStatus.Closed,
                CircuitStatus.Broken => CircuitStatus.HalfBroken,
                _ => _state
            };

            return(_state);
        }
        private void TryEnterState(CircuitStatus required)
        {
            CircuitStatus actual = default;

            switch (required)
            {
            case CircuitStatus.Closed:
                for (var i = 0; i < 100; i++)
                {
                    actual = _circuitBreaker.MarkSuccess();
                }

                break;

            case CircuitStatus.Broken:
                actual = _circuitBreaker.MarkSuccess();
                for (var i = 0; i < FailuresUntilBroken; i++)
                {
                    actual = _circuitBreaker.MarkFailure();
                }

                break;

            case CircuitStatus.PermanentlyBroken:
                for (var i = 0; i < FailuresUntilBroken; i++)
                {
                    actual = _circuitBreaker.MarkFailure();
                }

                break;

            case CircuitStatus.HalfBroken:
                TryEnterState(CircuitStatus.Broken);
                actual = _circuitBreaker.MarkSuccess();
                break;

            default:
                throw new InvalidOperationException("Unknown status: " + required);
            }

            actual.Should().Be(required);
        }
Пример #11
0
 public CircuitException(string message, CircuitStatus status, Exception innerException)
     : base(message, innerException)
 {
     Status = status;
 }
Пример #12
0
 private void Trace(CircuitStatus status, ICircuitRequest request, Exception exception, TimeSpan executiontime)
 {
     CircuitBreakerLog.LogTrace($"RequestId:{request.RequestId}|CircuitKey:{request.CircuitKey}|Status:{status}|ExecutionTime:{executiontime.TotalMilliseconds}ms|Msg:{exception?.Message}");
 }
Пример #13
0
 public NewCircuitStatus(CircuitStatus newStatus, string reason = "")
 {
     Status = newStatus;
     Date   = DateTime.UtcNow;
     Reason = reason;
 }
Пример #14
0
        private void UpdateCircuitBreakerStatus(ICircuitBreaker circuitBreaker, bool shouldUpdate, CircuitStatus circuitStatus)
        {
            if (!shouldUpdate)
            {
                return;
            }

            circuitBreaker.Status            = circuitStatus;
            circuitBreaker.LastStatusUpdated = _dateTimeProvider.OffsetNow;
        }
 internal void CanEnterExpectedState(CircuitStatus status)
 {
     TryEnterState(status);
 }
Пример #16
0
 public CircuitBreaker(int phaseSeconds = 60)
 {
     status        = CircuitStatus.Closed;
     this.timeSpan = TimeSpan.FromSeconds(phaseSeconds);
 }