xrpld
Toggle main menu visibility
Loading...
Searching...
No Matches
xrpld
overlay
detail
PeerSet.cpp
1
#include <xrpld/overlay/PeerSet.h>
2
3
#include <xrpld/app/main/Application.h>
4
#include <xrpld/overlay/Message.h>
5
#include <xrpld/overlay/Overlay.h>
6
#include <xrpld/overlay/Peer.h>
7
8
#include <xrpl/basics/Log.h>
9
#include <xrpl/beast/utility/Journal.h>
10
11
#include <google/protobuf/message.h>
12
13
#include <xrpl.pb.h>
14
15
#include <
algorithm
>
16
#include <
cstddef
>
17
#include <
functional
>
18
#include <
memory
>
19
#include <
set
>
20
#include <
utility
>
21
#include <
vector
>
22
23
namespace
xrpl
{
24
25
class
PeerSetImpl
:
public
PeerSet
26
{
27
public
:
28
PeerSetImpl
(
Application
& app);
29
30
void
31
addPeers
(
32
std::size_t
limit,
33
std::function
<
bool
(
std::shared_ptr<Peer>
const
&)> hasItem,
34
std::function
<
void
(
std::shared_ptr<Peer>
const
&)> onPeerAdded)
override
;
35
39
void
40
sendRequest
(
41
::google::protobuf::Message
const
& message,
42
protocol::MessageType type,
43
std::shared_ptr<Peer>
const
& peer)
override
;
44
45
[[nodiscard]]
std::set<Peer::ID>
const
&
46
getPeerIds
()
const override
;
47
48
private
:
49
// Used in this class for access to boost::asio::io_context and
50
// xrpl::Overlay.
51
Application
&
app_
;
52
beast::Journal
journal_
;
53
57
std::set<Peer::ID>
peers_
;
58
};
59
60
PeerSetImpl::PeerSetImpl
(
Application
& app) :
app_
(app),
journal_
(app.getJournal(
"PeerSet"
))
61
{
62
}
63
64
void
65
PeerSetImpl::addPeers
(
66
std::size_t
limit,
67
std::function
<
bool
(
std::shared_ptr<Peer>
const
&)> hasItem,
68
std::function
<
void
(
std::shared_ptr<Peer>
const
&)> onPeerAdded)
69
{
70
using
ScoredPeer =
std::pair<int, std::shared_ptr<Peer>
>;
71
72
auto
const
& overlay =
app_
.getOverlay();
73
74
std::vector<ScoredPeer>
pairs;
75
pairs.
reserve
(overlay.size());
76
77
overlay.foreach([&](
auto
const
& peer) {
78
auto
const
score = peer->getScore(hasItem(peer));
79
pairs.
emplace_back
(score, std::move(peer));
80
});
81
82
std::ranges::sort
(
83
pairs, [](ScoredPeer
const
& lhs, ScoredPeer
const
& rhs) {
return
lhs.first > rhs.first; });
84
85
std::size_t
accepted = 0;
86
for
(
auto
const
& pair : pairs)
87
{
88
auto
const
peer = pair.second;
89
if
(!
peers_
.insert(peer->id()).second)
90
continue
;
91
onPeerAdded(peer);
92
if
(++accepted >= limit)
93
break
;
94
}
95
}
96
97
void
98
PeerSetImpl::sendRequest
(
99
::google::protobuf::Message
const
& message,
100
protocol::MessageType type,
101
std::shared_ptr<Peer>
const
& peer)
102
{
103
auto
packet =
std::make_shared<Message>
(message, type);
104
if
(peer)
105
{
106
peer->send(packet);
107
return
;
108
}
109
110
for
(
auto
id
:
peers_
)
111
{
112
if
(
auto
p =
app_
.getOverlay().findPeerByShortID(
id
))
113
p->send(packet);
114
}
115
}
116
117
std::set<Peer::ID>
const
&
118
PeerSetImpl::getPeerIds
()
const
119
{
120
return
peers_
;
121
}
122
123
class
PeerSetBuilderImpl
:
public
PeerSetBuilder
124
{
125
public
:
126
PeerSetBuilderImpl
(
Application
& app) :
app_
(app)
127
{
128
}
129
130
std::unique_ptr<PeerSet>
131
build
()
override
132
{
133
return
std::make_unique<PeerSetImpl>
(
app_
);
134
}
135
136
private
:
137
Application
&
app_
;
138
};
139
140
std::unique_ptr<PeerSetBuilder>
141
makePeerSetBuilder
(
Application
& app)
142
{
143
return
std::make_unique<PeerSetBuilderImpl>
(app);
144
}
145
146
class
DummyPeerSet
:
public
PeerSet
147
{
148
public
:
149
DummyPeerSet
(
Application
& app) :
j_
(app.getJournal(
"DummyPeerSet"
))
150
{
151
}
152
153
void
154
addPeers
(
155
std::size_t
limit,
156
std::function
<
bool
(
std::shared_ptr<Peer>
const
&)> hasItem,
157
std::function
<
void
(
std::shared_ptr<Peer>
const
&)> onPeerAdded)
override
158
{
159
JLOG(
j_
.error()) <<
"DummyPeerSet addPeers should not be called"
;
160
}
161
162
void
163
sendRequest
(
164
::google::protobuf::Message
const
& message,
165
protocol::MessageType type,
166
std::shared_ptr<Peer>
const
& peer)
override
167
{
168
JLOG(
j_
.error()) <<
"DummyPeerSet sendRequest should not be called"
;
169
}
170
171
[[nodiscard]]
std::set<Peer::ID>
const
&
172
getPeerIds
()
const override
173
{
174
static
std::set<Peer::ID>
const
kEmptyPeers;
175
JLOG(
j_
.error()) <<
"DummyPeerSet getPeerIds should not be called"
;
176
return
kEmptyPeers;
177
}
178
179
private
:
180
beast::Journal
j_
;
181
};
182
183
std::unique_ptr<PeerSet>
184
makeDummyPeerSet
(
Application
& app)
185
{
186
return
std::make_unique<DummyPeerSet>
(app);
187
}
188
189
}
// namespace xrpl
algorithm
beast::Journal
A generic endpoint for log messages.
Definition
Journal.h:44
xrpl::Application
Definition
Application.h:94
xrpl::DummyPeerSet::DummyPeerSet
DummyPeerSet(Application &app)
Definition
PeerSet.cpp:149
xrpl::DummyPeerSet::j_
beast::Journal j_
Definition
PeerSet.cpp:180
xrpl::DummyPeerSet::addPeers
void addPeers(std::size_t limit, std::function< bool(std::shared_ptr< Peer > const &)> hasItem, std::function< void(std::shared_ptr< Peer > const &)> onPeerAdded) override
Try add more peers.
Definition
PeerSet.cpp:154
xrpl::DummyPeerSet::sendRequest
void sendRequest(::google::protobuf::Message const &message, protocol::MessageType type, std::shared_ptr< Peer > const &peer) override
Definition
PeerSet.cpp:163
xrpl::DummyPeerSet::getPeerIds
std::set< Peer::ID > const & getPeerIds() const override
get the set of ids of previously added peers
Definition
PeerSet.cpp:172
xrpl::PeerSetBuilderImpl::PeerSetBuilderImpl
PeerSetBuilderImpl(Application &app)
Definition
PeerSet.cpp:126
xrpl::PeerSetBuilderImpl::app_
Application & app_
Definition
PeerSet.cpp:137
xrpl::PeerSetBuilderImpl::build
std::unique_ptr< PeerSet > build() override
Definition
PeerSet.cpp:131
xrpl::PeerSetBuilder
Definition
PeerSet.h:70
xrpl::PeerSetImpl::getPeerIds
std::set< Peer::ID > const & getPeerIds() const override
get the set of ids of previously added peers
Definition
PeerSet.cpp:118
xrpl::PeerSetImpl::app_
Application & app_
Definition
PeerSet.cpp:51
xrpl::PeerSetImpl::PeerSetImpl
PeerSetImpl(Application &app)
Definition
PeerSet.cpp:60
xrpl::PeerSetImpl::addPeers
void addPeers(std::size_t limit, std::function< bool(std::shared_ptr< Peer > const &)> hasItem, std::function< void(std::shared_ptr< Peer > const &)> onPeerAdded) override
Try add more peers.
Definition
PeerSet.cpp:65
xrpl::PeerSetImpl::journal_
beast::Journal journal_
Definition
PeerSet.cpp:52
xrpl::PeerSetImpl::sendRequest
void sendRequest(::google::protobuf::Message const &message, protocol::MessageType type, std::shared_ptr< Peer > const &peer) override
Send a message to one or all peers.
Definition
PeerSet.cpp:98
xrpl::PeerSetImpl::peers_
std::set< Peer::ID > peers_
The identifiers of the peers we are tracking.
Definition
PeerSet.cpp:57
xrpl::PeerSet
Supports data retrieval by managing a set of peers.
Definition
PeerSet.h:30
cstddef
std::vector::emplace_back
T emplace_back(T... args)
std::function
functional
std::make_shared
T make_shared(T... args)
std::make_unique
T make_unique(T... args)
memory
xrpl
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition
algorithm.h:5
xrpl::makePeerSetBuilder
std::unique_ptr< PeerSetBuilder > makePeerSetBuilder(Application &app)
Definition
PeerSet.cpp:141
xrpl::makeDummyPeerSet
std::unique_ptr< PeerSet > makeDummyPeerSet(Application &app)
Make a dummy PeerSet that does not do anything.
Definition
PeerSet.cpp:184
std::pair
std::vector::reserve
T reserve(T... args)
set
std::shared_ptr
std::size_t
std::ranges::sort
T sort(T... args)
std::unique_ptr
utility
vector
Generated by
1.17.0