xrpld
Loading...
Searching...
No Matches
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
23namespace xrpl {
24
25class PeerSetImpl : public PeerSet
26{
27public:
29
30 void
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
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_t> const&
46 getPeerIds() const override;
47
48private:
49 // Used in this class for access to boost::asio::io_context and
50 // xrpl::Overlay.
53
58};
59
60PeerSetImpl::PeerSetImpl(Application& app) : app_(app), journal_(app.getJournal("PeerSet"))
61{
62}
63
64void
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
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
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
97void
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
119{
120 return peers_;
121}
122
124{
125public:
127 {
128 }
129
131 build() override
132 {
134 }
135
136private:
138};
139
145
146class DummyPeerSet : public PeerSet
147{
148public:
149 DummyPeerSet(Application& app) : j_(app.getJournal("DummyPeerSet"))
150 {
151 }
152
153 void
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
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_t> const&
172 getPeerIds() const override
173 {
174 static std::set<Peer::id_t> const kEmptyPeers;
175 JLOG(j_.error()) << "DummyPeerSet getPeerIds should not be called";
176 return kEmptyPeers;
177 }
178
179private:
181};
182
188
189} // namespace xrpl
A generic endpoint for log messages.
Definition Journal.h:44
DummyPeerSet(Application &app)
Definition PeerSet.cpp:149
beast::Journal j_
Definition PeerSet.cpp:180
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
void sendRequest(::google::protobuf::Message const &message, protocol::MessageType type, std::shared_ptr< Peer > const &peer) override
Definition PeerSet.cpp:163
std::set< Peer::id_t > const & getPeerIds() const override
get the set of ids of previously added peers
Definition PeerSet.cpp:172
PeerSetBuilderImpl(Application &app)
Definition PeerSet.cpp:126
std::unique_ptr< PeerSet > build() override
Definition PeerSet.cpp:131
Application & app_
Definition PeerSet.cpp:51
std::set< Peer::id_t > peers_
The identifiers of the peers we are tracking.
Definition PeerSet.cpp:57
PeerSetImpl(Application &app)
Definition PeerSet.cpp:60
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
beast::Journal journal_
Definition PeerSet.cpp:52
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
std::set< Peer::id_t > const & getPeerIds() const override
get the set of ids of previously added peers
Definition PeerSet.cpp:118
Supports data retrieval by managing a set of peers.
Definition PeerSet.h:30
T emplace_back(T... args)
T make_shared(T... args)
T make_unique(T... args)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
std::unique_ptr< PeerSetBuilder > makePeerSetBuilder(Application &app)
Definition PeerSet.cpp:141
std::unique_ptr< PeerSet > makeDummyPeerSet(Application &app)
Make a dummy PeerSet that does not do anything.
Definition PeerSet.cpp:184
T reserve(T... args)
T sort(T... args)