public void HalfOpen() { State = CircuitStatus.HalfOpen; Success = 0; OnStatusChanged(new NewCircuitStatus(State)); }
public CircuitBreaker(int maxErrors, int maxSuccess, TimeSpan circuitReset) { State = CircuitStatus.Closed; MaxErrors = maxErrors; MaxSuccess = maxSuccess; CircuitReset = circuitReset; }
public void Open(string reason) { State = CircuitStatus.Open; OpenedAt = DateTime.UtcNow; OnStatusChanged(new NewCircuitStatus(State, reason)); }
public void Close() { Errors = 0; State = CircuitStatus.Closed; OnStatusChanged(new NewCircuitStatus(State)); }
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); }
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); } }
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); }
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); }
public CircuitException(string message, CircuitStatus status, Exception innerException) : base(message, innerException) { Status = status; }
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}"); }
public NewCircuitStatus(CircuitStatus newStatus, string reason = "") { Status = newStatus; Date = DateTime.UtcNow; Reason = reason; }
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); }
public CircuitBreaker(int phaseSeconds = 60) { status = CircuitStatus.Closed; this.timeSpan = TimeSpan.FromSeconds(phaseSeconds); }