xrpld
Toggle main menu visibility
Loading...
Searching...
No Matches
libxrpl
core
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
15
namespace
xrpl
{
16
17
auto
18
HashRouter::emplace
(
UInt256
const
& key) ->
std::pair<Entry&, bool>
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
34
void
35
HashRouter::addSuppression
(
UInt256
const
& key)
36
{
37
std::scoped_lock
const
lock(
mutex_
);
38
39
emplace
(key);
40
}
41
42
bool
43
HashRouter::addSuppressionPeer
(
UInt256
const
& key,
PeerShortID
peer)
44
{
45
return
addSuppressionPeerWithStatus
(key, peer).first;
46
}
47
48
std::pair<bool, std::optional<Stopwatch::time_point>
>
49
HashRouter::addSuppressionPeerWithStatus
(
UInt256
const
& key,
PeerShortID
peer)
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
58
bool
59
HashRouter::addSuppressionPeer
(
UInt256
const
& key,
PeerShortID
peer,
HashRouterFlags
& flags)
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
69
bool
70
HashRouter::shouldProcess
(
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
85
HashRouterFlags
86
HashRouter::getFlags
(
UInt256
const
& key)
87
{
88
std::scoped_lock
const
lock(
mutex_
);
89
90
return
emplace
(key).first.getFlags();
91
}
92
93
bool
94
HashRouter::setFlags
(
UInt256
const
& key,
HashRouterFlags
flags)
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
109
auto
110
HashRouter::shouldRelay
(
UInt256
const
& key) ->
std::optional<std::set<PeerShortID>
>
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
chrono
xrpl::HashRouter::Entry
An entry in the routing table.
Definition
HashRouter.h:128
xrpl::HashRouter::setup_
Setup const setup_
Definition
HashRouter.h:277
xrpl::HashRouter::addSuppressionPeerWithStatus
std::pair< bool, std::optional< Stopwatch::time_point > > addSuppressionPeerWithStatus(UInt256 const &key, PeerShortID peer)
Add a suppression peer and get message's relay status.
Definition
HashRouter.cpp:49
xrpl::HashRouter::addSuppression
void addSuppression(UInt256 const &key)
Definition
HashRouter.cpp:35
xrpl::HashRouter::mutex_
std::mutex mutex_
Definition
HashRouter.h:274
xrpl::HashRouter::setFlags
bool setFlags(UInt256 const &key, HashRouterFlags flags)
Set the flags on a hash.
Definition
HashRouter.cpp:94
xrpl::HashRouter::addSuppressionPeer
bool addSuppressionPeer(UInt256 const &key, PeerShortID peer)
Definition
HashRouter.cpp:43
xrpl::HashRouter::emplace
std::pair< Entry &, bool > emplace(UInt256 const &)
Definition
HashRouter.cpp:18
xrpl::HashRouter::shouldRelay
std::optional< std::set< PeerShortID > > shouldRelay(UInt256 const &key)
Determines whether the hashed item should be relayed.
Definition
HashRouter.cpp:110
xrpl::HashRouter::PeerShortID
std::uint32_t PeerShortID
Definition
HashRouter.h:92
xrpl::HashRouter::getFlags
HashRouterFlags getFlags(UInt256 const &key)
Definition
HashRouter.cpp:86
xrpl::HashRouter::shouldProcess
bool shouldProcess(UInt256 const &key, PeerShortID peer, HashRouterFlags &flags, std::chrono::seconds txInterval)
Definition
HashRouter.cpp:70
xrpl::HashRouter::suppressionMap_
beast::AgedUnorderedMap< UInt256, Entry, Stopwatch::ClockType, HardenedHash< StrongHash > > suppressionMap_
Definition
HashRouter.h:281
std::chrono::seconds
functional
std::make_pair
T make_pair(T... args)
mutex
xrpl
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition
algorithm.h:5
xrpl::UInt256
BaseUInt< 256 > UInt256
Definition
base_uint.h:580
xrpl::HashRouterFlags
HashRouterFlags
Definition
HashRouter.h:20
optional
std::pair
std::ref
T ref(T... args)
std::scoped_lock
set
utility
Generated by
1.17.0