Commit c59aecdd authored by TousakaRin's avatar TousakaRin

Can be isolated in advance when initializing

parent 2685cd8c
...@@ -64,6 +64,7 @@ CircuitBreaker::EmaErrorRecorder::EmaErrorRecorder(int window_size, ...@@ -64,6 +64,7 @@ CircuitBreaker::EmaErrorRecorder::EmaErrorRecorder(int window_size,
, _max_error_percent(max_error_percent) , _max_error_percent(max_error_percent)
, _smooth(std::pow(EPSILON, 1.0/window_size)) , _smooth(std::pow(EPSILON, 1.0/window_size))
, _sample_count(0) , _sample_count(0)
, _error_count(0)
, _ema_error_cost(0) , _ema_error_cost(0)
, _ema_latency(0) { , _ema_latency(0) {
} }
...@@ -80,8 +81,15 @@ bool CircuitBreaker::EmaErrorRecorder::OnCallEnd(int error_code, ...@@ -80,8 +81,15 @@ bool CircuitBreaker::EmaErrorRecorder::OnCallEnd(int error_code,
healthy = UpdateErrorCost(latency, ema_latency); healthy = UpdateErrorCost(latency, ema_latency);
} }
if (_sample_count.fetch_add(1, butil::memory_order_relaxed) < _window_size) { // When the window is initializing, use error_rate to determine
return true; // if it needs to be isolated.
if (_sample_count.load(butil::memory_order_relaxed) < _window_size &&
_sample_count.fetch_add(1, butil::memory_order_relaxed) < _window_size) {
if (error_code != 0) {
const int32_t error_count =
_error_count.fetch_add(1, butil::memory_order_relaxed);
return error_count < _window_size * _max_error_percent / 100;
}
} }
return healthy; return healthy;
...@@ -89,6 +97,7 @@ bool CircuitBreaker::EmaErrorRecorder::OnCallEnd(int error_code, ...@@ -89,6 +97,7 @@ bool CircuitBreaker::EmaErrorRecorder::OnCallEnd(int error_code,
void CircuitBreaker::EmaErrorRecorder::Reset() { void CircuitBreaker::EmaErrorRecorder::Reset() {
_sample_count.store(0, butil::memory_order_relaxed); _sample_count.store(0, butil::memory_order_relaxed);
_error_count.store(0, butil::memory_order_relaxed);
_ema_error_cost.store(0, butil::memory_order_relaxed); _ema_error_cost.store(0, butil::memory_order_relaxed);
_ema_latency.store(0, butil::memory_order_relaxed); _ema_latency.store(0, butil::memory_order_relaxed);
} }
......
...@@ -74,7 +74,8 @@ private: ...@@ -74,7 +74,8 @@ private:
const int _max_error_percent; const int _max_error_percent;
const double _smooth; const double _smooth;
butil::atomic<int64_t> _sample_count; butil::atomic<int32_t> _sample_count;
butil::atomic<int32_t> _error_count;
butil::atomic<int64_t> _ema_error_cost; butil::atomic<int64_t> _ema_error_cost;
butil::atomic<int64_t> _ema_latency; butil::atomic<int64_t> _ema_latency;
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment