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
40PeerSetImpl::PeerSetImpl(Application& app) : 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(), pairs.end(), [](ScoredPeer const& lhs, ScoredPeer const& rhs) { return lhs.first > rhs.first; });
64
66 for (auto const& pair : pairs)
67 {
68 auto const peer = pair.second;
69 if (!peers_.insert(peer->id()).second)
70 continue;
71 onPeerAdded(peer);
72 if (++accepted >= limit)
73 break;
74 }
75}
76
77void
79 ::google::protobuf::Message const& message,
80 protocol::MessageType type,
81 std::shared_ptr<Peer> const& peer)
82{
83 auto packet = std::make_shared<Message>(message, type);
84 if (peer)
85 {
86 peer->send(packet);
87 return;
88 }
89
90 for (auto id : peers_)
91 {
92 if (auto p = app_.overlay().findPeerByShortID(id))
93 p->send(packet);
94 }
95}
96
99{
100 return peers_;
101}
102
104{
105public:
107 {
108 }
109
111 build() override
112 {
114 }
115
116private:
118};
119
125
126class DummyPeerSet : public PeerSet
127{
128public:
129 DummyPeerSet(Application& app) : j_(app.journal("DummyPeerSet"))
130 {
131 }
132
133 void
135 std::size_t limit,
136 std::function<bool(std::shared_ptr<Peer> const&)> hasItem,
137 std::function<void(std::shared_ptr<Peer> const&)> onPeerAdded) override
138 {
139 JLOG(j_.error()) << "DummyPeerSet addPeers should not be called";
140 }
141
142 void
144 ::google::protobuf::Message const& message,
145 protocol::MessageType type,
146 std::shared_ptr<Peer> const& peer) override
147 {
148 JLOG(j_.error()) << "DummyPeerSet sendRequest should not be called";
149 }
150
152 getPeerIds() const override
153 {
154 static std::set<Peer::id_t> emptyPeers;
155 JLOG(j_.error()) << "DummyPeerSet getPeerIds should not be called";
156 return emptyPeers;
157 }
158
159private:
161};
162
168
169} // namespace xrpl
T begin(T... args)
A generic endpoint for log messages.
Definition Journal.h:41
Stream error() const
Definition Journal.h:319
virtual Overlay & overlay()=0
DummyPeerSet(Application &app)
Definition PeerSet.cpp:129
beast::Journal j_
Definition PeerSet.cpp:160
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:134
void sendRequest(::google::protobuf::Message const &message, protocol::MessageType type, std::shared_ptr< Peer > const &peer) override
Definition PeerSet.cpp:143
std::set< Peer::id_t > const & getPeerIds() const override
get the set of ids of previously added peers
Definition PeerSet.cpp:152
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:106
virtual std::unique_ptr< PeerSet > build() override
Definition PeerSet.cpp:111
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:45
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:78
std::set< Peer::id_t > const & getPeerIds() const override
get the set of ids of previously added peers
Definition PeerSet.cpp:98
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:164
std::unique_ptr< PeerSetBuilder > make_PeerSetBuilder(Application &app)
Definition PeerSet.cpp:121
@ accepted
Manifest is valid.
T reserve(T... args)
T sort(T... args)