rippled
Loading...
Searching...
No Matches
PeerSet.cpp
1#include <xrpld/app/main/Application.h>
2#include <xrpld/overlay/Overlay.h>
3#include <xrpld/overlay/PeerSet.h>
4
5#include <xrpl/core/JobQueue.h>
6
7namespace xrpl {
8
9class PeerSetImpl : public PeerSet
10{
11public:
13
14 void
16 std::size_t limit,
17 std::function<bool(std::shared_ptr<Peer> const&)> hasItem,
18 std::function<void(std::shared_ptr<Peer> const&)> onPeerAdded) override;
19
21 void
23 ::google::protobuf::Message const& message,
24 protocol::MessageType type,
25 std::shared_ptr<Peer> const& peer) override;
26
28 getPeerIds() const override;
29
30private:
31 // Used in this class for access to boost::asio::io_context and
32 // xrpl::Overlay.
35
38};
39
41 : app_(app), journal_(app.journal("PeerSet"))
42{
43}
44
45void
47 std::size_t limit,
48 std::function<bool(std::shared_ptr<Peer> const&)> hasItem,
49 std::function<void(std::shared_ptr<Peer> const&)> onPeerAdded)
50{
51 using ScoredPeer = std::pair<int, std::shared_ptr<Peer>>;
52
53 auto const& overlay = app_.overlay();
54
56 pairs.reserve(overlay.size());
57
58 overlay.foreach([&](auto const& peer) {
59 auto const score = peer->getScore(hasItem(peer));
60 pairs.emplace_back(score, std::move(peer));
61 });
62
64 pairs.begin(),
65 pairs.end(),
66 [](ScoredPeer const& lhs, ScoredPeer const& rhs) {
67 return lhs.first > rhs.first;
68 });
69
71 for (auto const& pair : pairs)
72 {
73 auto const peer = pair.second;
74 if (!peers_.insert(peer->id()).second)
75 continue;
76 onPeerAdded(peer);
77 if (++accepted >= limit)
78 break;
79 }
80}
81
82void
84 ::google::protobuf::Message const& message,
85 protocol::MessageType type,
86 std::shared_ptr<Peer> const& peer)
87{
88 auto packet = std::make_shared<Message>(message, type);
89 if (peer)
90 {
91 peer->send(packet);
92 return;
93 }
94
95 for (auto id : peers_)
96 {
97 if (auto p = app_.overlay().findPeerByShortID(id))
98 p->send(packet);
99 }
100}
101
104{
105 return peers_;
106}
107
109{
110public:
112 {
113 }
114
116 build() override
117 {
119 }
120
121private:
123};
124
130
131class DummyPeerSet : public PeerSet
132{
133public:
134 DummyPeerSet(Application& app) : j_(app.journal("DummyPeerSet"))
135 {
136 }
137
138 void
140 std::size_t limit,
141 std::function<bool(std::shared_ptr<Peer> const&)> hasItem,
142 std::function<void(std::shared_ptr<Peer> const&)> onPeerAdded) override
143 {
144 JLOG(j_.error()) << "DummyPeerSet addPeers should not be called";
145 }
146
147 void
149 ::google::protobuf::Message const& message,
150 protocol::MessageType type,
151 std::shared_ptr<Peer> const& peer) override
152 {
153 JLOG(j_.error()) << "DummyPeerSet sendRequest should not be called";
154 }
155
157 getPeerIds() const override
158 {
159 static std::set<Peer::id_t> emptyPeers;
160 JLOG(j_.error()) << "DummyPeerSet getPeerIds should not be called";
161 return emptyPeers;
162 }
163
164private:
166};
167
173
174} // namespace xrpl
T begin(T... args)
A generic endpoint for log messages.
Definition Journal.h:41
Stream error() const
Definition Journal.h:327
virtual Overlay & overlay()=0
DummyPeerSet(Application &app)
Definition PeerSet.cpp:134
beast::Journal j_
Definition PeerSet.cpp:165
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:139
void sendRequest(::google::protobuf::Message const &message, protocol::MessageType type, std::shared_ptr< Peer > const &peer) override
Definition PeerSet.cpp:148
std::set< Peer::id_t > const & getPeerIds() const override
get the set of ids of previously added peers
Definition PeerSet.cpp:157
virtual std::shared_ptr< Peer > findPeerByShortID(Peer::id_t const &id) const =0
Returns the peer with the matching short id, or null.
PeerSetBuilderImpl(Application &app)
Definition PeerSet.cpp:111
virtual std::unique_ptr< PeerSet > build() override
Definition PeerSet.cpp:116
Application & app_
Definition PeerSet.cpp:33
std::set< Peer::id_t > peers_
The identifiers of the peers we are tracking.
Definition PeerSet.cpp:37
PeerSetImpl(Application &app)
Definition PeerSet.cpp:40
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:46
beast::Journal journal_
Definition PeerSet.cpp:34
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:83
std::set< Peer::id_t > const & getPeerIds() const override
get the set of ids of previously added peers
Definition PeerSet.cpp:103
Supports data retrieval by managing a set of peers.
Definition PeerSet.h:21
T emplace_back(T... args)
T end(T... args)
T is_same_v
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:6
std::unique_ptr< PeerSet > make_DummyPeerSet(Application &app)
Make a dummy PeerSet that does not do anything.
Definition PeerSet.cpp:169
std::unique_ptr< PeerSetBuilder > make_PeerSetBuilder(Application &app)
Definition PeerSet.cpp:126
@ accepted
Manifest is valid.
T reserve(T... args)
T sort(T... args)