xrpld
Loading...
Searching...
No Matches
HashRouter.cpp
1#include <xrpl/core/HashRouter.h>
2
3#include <xrpl/basics/base_uint.h>
4#include <xrpl/basics/chrono.h>
5#include <xrpl/beast/container/detail/aged_unordered_container.h>
6#include <xrpl/beast/utility/instrumentation.h>
7
8#include <chrono>
9#include <functional>
10#include <mutex>
11#include <optional>
12#include <set>
13#include <utility>
14
15namespace xrpl {
16
17auto
19{
20 auto iter = suppressionMap_.find(key);
21
22 if (iter != suppressionMap_.end())
23 {
24 suppressionMap_.touch(iter);
25 return std::make_pair(std::ref(iter->second), false);
26 }
27
28 // See if any suppressions need to be expired
29 expire(suppressionMap_, setup_.holdTime);
30
31 return std::make_pair(std::ref(suppressionMap_.emplace(key, Entry()).first->second), true);
32}
33
34void
36{
37 std::scoped_lock const lock(mutex_);
38
39 emplace(key);
40}
41
42bool
44{
45 return addSuppressionPeerWithStatus(key, peer).first;
46}
47
50{
51 std::scoped_lock const lock(mutex_);
52
53 auto result = emplace(key);
54 result.first.addPeer(peer);
55 return {result.second, result.first.relayed()};
56}
57
58bool
60{
61 std::scoped_lock const lock(mutex_);
62
63 auto [s, created] = emplace(key);
64 s.addPeer(peer);
65 flags = s.getFlags();
66 return created;
67}
68
69bool
71 uint256 const& key,
72 PeerShortID peer,
73 HashRouterFlags& flags,
74 std::chrono::seconds txInterval)
75{
76 std::scoped_lock const lock(mutex_);
77
78 auto result = emplace(key);
79 auto& s = result.first;
80 s.addPeer(peer);
81 flags = s.getFlags();
82 return s.shouldProcess(suppressionMap_.clock().now(), txInterval);
83}
84
87{
88 std::scoped_lock const lock(mutex_);
89
90 return emplace(key).first.getFlags();
91}
92
93bool
95{
96 XRPL_ASSERT(static_cast<bool>(flags), "xrpl::HashRouter::setFlags : valid input");
97
98 std::scoped_lock const lock(mutex_);
99
100 auto& s = emplace(key).first;
101
102 if ((s.getFlags() & flags) == flags)
103 return false;
104
105 s.setFlags(flags);
106 return true;
107}
108
109auto
111{
112 std::scoped_lock const lock(mutex_);
113
114 auto& s = emplace(key).first;
115
116 if (!s.shouldRelay(suppressionMap_.clock().now(), setup_.relayTime))
117 return {};
118
119 return s.releasePeerSet();
120}
121
122} // namespace xrpl
An entry in the routing table.
Definition HashRouter.h:110
std::optional< std::set< PeerShortID > > shouldRelay(uint256 const &key)
Determines whether the hashed item should be relayed.
Setup const setup_
Definition HashRouter.h:250
HashRouterFlags getFlags(uint256 const &key)
bool addSuppressionPeer(uint256 const &key, PeerShortID peer)
std::mutex mutex_
Definition HashRouter.h:247
bool setFlags(uint256 const &key, HashRouterFlags flags)
Set the flags on a hash.
std::pair< bool, std::optional< Stopwatch::time_point > > addSuppressionPeerWithStatus(uint256 const &key, PeerShortID peer)
Add a suppression peer and get message's relay status.
std::pair< Entry &, bool > emplace(uint256 const &)
bool shouldProcess(uint256 const &key, PeerShortID peer, HashRouterFlags &flags, std::chrono::seconds txInterval)
beast::aged_unordered_map< uint256, Entry, Stopwatch::clock_type, HardenedHash< strong_hash > > suppressionMap_
Definition HashRouter.h:254
void addSuppression(uint256 const &key)
std::uint32_t PeerShortID
Definition HashRouter.h:80
T make_pair(T... args)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
HashRouterFlags
Definition HashRouter.h:14
BaseUInt< 256 > uint256
Definition base_uint.h:562
T ref(T... args)