/root/bitcoin/src/node/timeoffsets.h
Line | Count | Source (jump to first uncovered line) |
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 | | class TimeOffsets |
19 | | { |
20 | | public: |
21 | 0 | 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 |