forked from stellar/stellar-core
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathOverlayManagerImpl.h
171 lines (134 loc) · 5.24 KB
/
OverlayManagerImpl.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#pragma once
// Copyright 2014 Stellar Development Foundation and contributors. Licensed
// under the Apache License, Version 2.0. See the COPYING file at the root
// of this distribution or at http://www.apache.org/licenses/LICENSE-2.0
#include "LoadManager.h"
#include "Peer.h"
#include "PeerAuth.h"
#include "PeerDoor.h"
#include "PeerManager.h"
#include "herder/TxSetFrame.h"
#include "overlay/Floodgate.h"
#include "overlay/ItemFetcher.h"
#include "overlay/OverlayManager.h"
#include "overlay/OverlayMetrics.h"
#include "overlay/StellarXDR.h"
#include "util/Timer.h"
#include <future>
#include <set>
#include <vector>
namespace medida
{
class Meter;
class Counter;
}
/*
Maintain the set of peers we are connected to
*/
namespace stellar
{
class OverlayManagerImpl : public OverlayManager
{
protected:
Application& mApp;
std::set<PeerBareAddress> mConfigurationPreferredPeers;
struct PeersList
{
explicit PeersList(OverlayManagerImpl& overlayManager,
medida::MetricsRegistry& metricsRegistry,
std::string const& directionString,
std::string const& cancelledName,
int maxAuthenticatedCount);
medida::Meter& mConnectionsAttempted;
medida::Meter& mConnectionsEstablished;
medida::Meter& mConnectionsDropped;
medida::Meter& mConnectionsCancelled;
OverlayManagerImpl& mOverlayManager;
std::string mDirectionString;
int mMaxAuthenticatedCount;
std::vector<Peer::pointer> mPending;
std::map<NodeID, Peer::pointer> mAuthenticated;
Peer::pointer byAddress(PeerBareAddress const& address) const;
void removePeer(Peer* peer);
bool moveToAuthenticated(Peer::pointer peer);
bool acceptAuthenticatedPeer(Peer::pointer peer);
void shutdown();
};
PeersList mInboundPeers;
PeersList mOutboundPeers;
PeersList& getPeersList(Peer* peer);
PeerManager mPeerManager;
PeerDoor mDoor;
PeerAuth mAuth;
LoadManager mLoad;
bool mShuttingDown;
OverlayMetrics mOverlayMetrics;
void tick();
VirtualTimer mTimer;
VirtualTimer mPeerIPTimer;
friend class OverlayManagerTests;
Floodgate mFloodGate;
public:
OverlayManagerImpl(Application& app);
~OverlayManagerImpl();
void ledgerClosed(uint32_t lastClosedledgerSeq) override;
void recvFloodedMsg(StellarMessage const& msg, Peer::pointer peer) override;
void broadcastMessage(StellarMessage const& msg,
bool force = false) override;
void connectTo(PeerBareAddress const& address) override;
void addInboundConnection(Peer::pointer peer) override;
bool addOutboundConnection(Peer::pointer peer) override;
void removePeer(Peer* peer) override;
void storeConfigPeers();
void purgeDeadPeers();
bool acceptAuthenticatedPeer(Peer::pointer peer) override;
bool isPreferred(Peer* peer) const override;
std::vector<Peer::pointer> const& getInboundPendingPeers() const override;
std::vector<Peer::pointer> const& getOutboundPendingPeers() const override;
std::vector<Peer::pointer> getPendingPeers() const override;
int getPendingPeersCount() const override;
std::map<NodeID, Peer::pointer> const&
getInboundAuthenticatedPeers() const override;
std::map<NodeID, Peer::pointer> const&
getOutboundAuthenticatedPeers() const override;
std::map<NodeID, Peer::pointer> getAuthenticatedPeers() const override;
int getAuthenticatedPeersCount() const override;
// returns nullptr if the passed peer isn't found
Peer::pointer getConnectedPeer(PeerBareAddress const& address) override;
std::vector<Peer::pointer> getRandomAuthenticatedPeers() override;
std::set<Peer::pointer> getPeersKnows(Hash const& h) override;
OverlayMetrics& getOverlayMetrics() override;
PeerAuth& getPeerAuth() override;
LoadManager& getLoadManager() override;
PeerManager& getPeerManager() override;
void start() override;
void shutdown() override;
bool isShuttingDown() const override;
private:
struct ResolvedPeers
{
std::vector<PeerBareAddress> known;
std::vector<PeerBareAddress> preferred;
};
std::map<PeerType, std::unique_ptr<RandomPeerSource>> mPeerSources;
std::future<ResolvedPeers> mResolvedPeers;
void triggerPeerResolution();
std::vector<PeerBareAddress>
resolvePeers(std::vector<std::string> const& peers);
void storePeerList(std::vector<PeerBareAddress> const& addresses,
bool setPreferred, bool startup);
virtual bool connectToImpl(PeerBareAddress const& address,
bool forceoutbound);
int connectTo(int maxNum, PeerType peerType);
int connectTo(std::vector<PeerBareAddress> const& peers,
bool forceoutbound);
std::vector<PeerBareAddress> getPeersToConnectTo(int maxNum,
PeerType peerType);
bool moveToAuthenticated(Peer::pointer peer);
int availableOutboundPendingSlots() const;
int availableOutboundAuthenticatedSlots() const;
int nonPreferredAuthenticatedCount() const;
bool isPossiblyPreferred(std::string const& ip);
void updateSizeCounters();
};
}