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