Common System 0.2.0
Common interfaces and patterns for system integration
Loading...
Searching...
No Matches
failure_window.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
13#pragma once
14
15#include <algorithm>
16#include <chrono>
17#include <deque>
18#include <mutex>
19
21
34public:
35 using clock_type = std::chrono::steady_clock;
36 using time_point = clock_type::time_point;
37 using duration = std::chrono::milliseconds;
38
43 explicit failure_window(duration window_duration)
44 : window_duration_(window_duration)
45 {
46 }
47
51 auto record_failure() -> void
52 {
53 std::lock_guard<std::mutex> lock(mutex_);
54 failures_.push_back(clock_type::now());
55 }
56
62 [[nodiscard]] auto get_failure_count() const -> std::size_t
63 {
64 std::lock_guard<std::mutex> lock(mutex_);
66 return failures_.size();
67 }
68
72 auto reset() -> void
73 {
74 std::lock_guard<std::mutex> lock(mutex_);
75 failures_.clear();
76 }
77
82 [[nodiscard]] auto is_empty() -> bool
83 {
84 std::lock_guard<std::mutex> lock(mutex_);
86 return failures_.empty();
87 }
88
89private:
94 auto cleanup_expired_failures() const -> void
95 {
96 const auto now = clock_type::now();
97 const auto cutoff = now - window_duration_;
98
99 // Remove all failures older than cutoff
100 failures_.erase(
101 std::remove_if(failures_.begin(), failures_.end(),
102 [cutoff](const time_point& t) { return t < cutoff; }),
103 failures_.end());
104 }
105
107 mutable std::deque<time_point> failures_;
108 mutable std::mutex mutex_;
109};
110
111} // namespace kcenon::common::resilience
Thread-safe sliding window for failure tracking.
auto is_empty() -> bool
Check if window is empty (no recent failures).
auto get_failure_count() const -> std::size_t
Get current failure count within window. Removes expired failures before counting.
auto record_failure() -> void
Record a new failure at current time.
auto cleanup_expired_failures() const -> void
Remove failures outside the time window. Must be called with mutex locked.
auto reset() -> void
Clear all recorded failures.
failure_window(duration window_duration)
Construct a failure window with specified duration.