120 int64_t jitter_us()
const;
122 std::vector<ClockOffsetResult> _results;
141 std::chrono::milliseconds stale = std::chrono::seconds(30));
149 std::chrono::steady_clock::time_point now =
150 std::chrono::steady_clock::now());
155 std::chrono::steady_clock::time_point now =
156 std::chrono::steady_clock::now())
const;
163 std::chrono::steady_clock::time_point now =
164 std::chrono::steady_clock::now())
const;
169 mutable std::mutex _mtx;
170 std::chrono::milliseconds _stale;
172 std::map<std::string, std::map<std::string, ClockOffsetResult>> _domains;
210 std::chrono::milliseconds window = std::chrono::seconds(10));
212 void record(
const std::string &host, int64_t skew_us,
213 std::chrono::steady_clock::time_point now =
214 std::chrono::steady_clock::now());
216 std::vector<HostSkewStat>
217 snapshot(std::chrono::steady_clock::time_point now =
218 std::chrono::steady_clock::now())
const;
224 std::deque<std::pair<std::chrono::steady_clock::time_point, int64_t>>
226 std::chrono::steady_clock::time_point last_seen{};
229 mutable std::mutex _mtx;
230 std::chrono::milliseconds _window;
231 std::map<std::string, Entry> _entries;
MADS_EXPORT const char * agent_id(agent_t agent)
Returns the current agent identifier.
Per-clock-domain adoption of the smallest-delay measurement heard from any agent sharing that domain ...
void record(const std::string &domain, const ClockOffsetResult &r, std::chrono::steady_clock::time_point now=std::chrono::steady_clock::now())
bool is_winner(const std::string &domain, const std::string &agent_id, std::chrono::steady_clock::time_point now=std::chrono::steady_clock::now()) const
ClockConsensus(std::chrono::milliseconds stale=std::chrono::seconds(30))
ClockOffsetResult adopted(const std::string &domain, std::chrono::steady_clock::time_point now=std::chrono::steady_clock::now()) const
Accumulates ClockSamples and returns the classic NTP "best of N": the retained sample with the smalle...
void add(const ClockSample &s)
ClockOffsetResult best() const
ClockOffsetResult median() const
ClockOffsetEstimator(size_t keep=8)
Thread-safe sliding-window tracker of per-host clock skew, fed by mads top's passive mode: for every ...
HostSkewStats(std::chrono::milliseconds window=std::chrono::seconds(10))
std::vector< HostSkewStat > snapshot(std::chrono::steady_clock::time_point now=std::chrono::steady_clock::now()) const
void record(const std::string &host, int64_t skew_us, std::chrono::steady_clock::time_point now=std::chrono::steady_clock::now())
ClockOffsetResult estimate(const ClockSample &s)
NTP-style estimate from one four-timestamp exchange.
ClockSource
Which mechanism produced a ClockOffsetResult.
Result of a clock-offset measurement: offset_us added to a clock in the measured domain yields broker...
std::string origin_agent_id
std::chrono::steady_clock::time_point measured_at
std::string clock_ref() const
One four-timestamp exchange, all fields microseconds since the Unix epoch: t1/t4 read from the initia...
Snapshot of one host's passive clock skew, as computed by HostSkewStats::snapshot() at a given instan...
std::chrono::steady_clock::time_point last_seen