Line data Source code
1 : // Copyright (c) 2024-present The Bitcoin Core developers
2 : // Distributed under the MIT software license, see the accompanying
3 : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 :
5 : #ifndef BITCOIN_NODE_TIMEOFFSETS_H
6 : #define BITCOIN_NODE_TIMEOFFSETS_H
7 :
8 : #include <sync.h>
9 :
10 : #include <chrono>
11 : #include <cstddef>
12 : #include <deque>
13 :
14 : namespace node {
15 : class Warnings;
16 : } // namespace node
17 :
18 5 : class TimeOffsets
19 : {
20 : public:
21 1095 : TimeOffsets(node::Warnings& warnings) : m_warnings{warnings} {}
22 :
23 : private:
24 : //! Maximum number of timeoffsets stored.
25 : static constexpr size_t MAX_SIZE{50};
26 : //! Minimum difference between system and network time for a warning to be raised.
27 : static constexpr std::chrono::minutes WARN_THRESHOLD{10};
28 :
29 : mutable Mutex m_mutex;
30 : /** The observed time differences between our local clock and those of our outbound peers. A
31 : * positive offset means our peer's clock is ahead of our local clock. */
32 : std::deque<std::chrono::seconds> m_offsets GUARDED_BY(m_mutex){};
33 :
34 : node::Warnings& m_warnings;
35 :
36 : public:
37 : /** Add a new time offset sample. */
38 : void Add(std::chrono::seconds offset) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
39 :
40 : /** Compute and return the median of the collected time offset samples. The median is returned
41 : * as 0 when there are less than 5 samples. */
42 : std::chrono::seconds Median() const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
43 :
44 : /** Raise warnings if the median time offset exceeds the warnings threshold. Returns true if
45 : * warnings were raised. */
46 : bool WarnIfOutOfSync() const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
47 : };
48 :
49 : #endif // BITCOIN_NODE_TIMEOFFSETS_H
|