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