Skip to content

Commit 934dd8c

Browse files
committed
net_mn: add single MN connection process.
1 parent 15d70e7 commit 934dd8c

File tree

2 files changed

+59
-25
lines changed

2 files changed

+59
-25
lines changed

src/tiertwo/net_masternodes.cpp

Lines changed: 56 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,16 @@ bool TierTwoConnMan::isMasternodeQuorumNode(const CNode* pnode)
6868
return false;
6969
}
7070

71+
bool TierTwoConnMan::addPendingMasternode(const uint256& proTxHash)
72+
{
73+
LOCK(cs_vPendingMasternodes);
74+
if (std::find(vPendingMasternodes.begin(), vPendingMasternodes.end(), proTxHash) != vPendingMasternodes.end()) {
75+
return false;
76+
}
77+
vPendingMasternodes.emplace_back(proTxHash);
78+
return true;
79+
}
80+
7181
void TierTwoConnMan::addPendingProbeConnections(const std::set<uint256>& proTxHashes)
7282
{
7383
LOCK(cs_vPendingMasternodes);
@@ -160,40 +170,61 @@ void TierTwoConnMan::ThreadOpenMasternodeConnections()
160170
bool isProbe = false;
161171
{
162172
LOCK(cs_vPendingMasternodes);
163-
std::vector<CDeterministicMNCPtr> pending;
164-
for (const auto& group: masternodeQuorumNodes) {
165-
for (const auto& proRegTxHash: group.second) {
166-
// Skip if already have this member connected
167-
if (std::count(connectedProRegTxHashes.begin(), connectedProRegTxHashes.end(), proRegTxHash) > 0) continue;
168-
169-
// Check if DMN exists in tip list
170-
const auto& dmn = mnList.GetValidMN(proRegTxHash);
171-
if (!dmn) continue;
172-
auto peerData = std::find(connectedNodes.begin(), connectedNodes.end(), dmn->pdmnState->addr);
173173

174-
// Skip already connected nodes.
175-
if (peerData != std::end(connectedNodes) && (peerData->f_disconnect || peerData->f_is_mn_conn)) {
176-
continue;
174+
// First try to connect to pending MNs
175+
if (!vPendingMasternodes.empty()) {
176+
auto dmn = mnList.GetValidMN(vPendingMasternodes.front());
177+
vPendingMasternodes.erase(vPendingMasternodes.begin());
178+
if (dmn) {
179+
auto peerData = std::find(connectedNodes.begin(), connectedNodes.end(), dmn->pdmnState->addr);
180+
if (peerData == std::end(connectedNodes)) {
181+
dmnToConnect = dmn;
182+
LogPrint(BCLog::NET_MN, "%s -- opening pending masternode connection to %s, service=%s\n",
183+
__func__, dmn->proTxHash.ToString(), dmn->pdmnState->addr.ToString());
177184
}
185+
}
186+
}
178187

179-
// Check if we already tried this connection recently to not retry too often
180-
int64_t lastAttempt = g_mmetaman.GetMetaInfo(dmn->proTxHash)->GetLastOutboundAttempt();
181-
// back off trying connecting to an address if we already tried recently
182-
if (currentTime - lastAttempt < chainParams.LLMQConnectionRetryTimeout()) {
183-
continue;
188+
// Secondly, try to connect quorum members
189+
if (!dmnToConnect) {
190+
std::vector<CDeterministicMNCPtr> pending;
191+
for (const auto& group: masternodeQuorumNodes) {
192+
for (const auto& proRegTxHash: group.second) {
193+
// Skip if already have this member connected
194+
if (std::count(connectedProRegTxHashes.begin(), connectedProRegTxHashes.end(), proRegTxHash) > 0)
195+
continue;
196+
197+
// Check if DMN exists in tip list
198+
const auto& dmn = mnList.GetValidMN(proRegTxHash);
199+
if (!dmn) continue;
200+
auto peerData = std::find(connectedNodes.begin(), connectedNodes.end(), dmn->pdmnState->addr);
201+
202+
// Skip already connected nodes.
203+
if (peerData != std::end(connectedNodes) &&
204+
(peerData->f_disconnect || peerData->f_is_mn_conn)) {
205+
continue;
206+
}
207+
208+
// Check if we already tried this connection recently to not retry too often
209+
int64_t lastAttempt = g_mmetaman.GetMetaInfo(dmn->proTxHash)->GetLastOutboundAttempt();
210+
// back off trying connecting to an address if we already tried recently
211+
if (currentTime - lastAttempt < chainParams.LLMQConnectionRetryTimeout()) {
212+
continue;
213+
}
214+
pending.emplace_back(dmn);
184215
}
185-
pending.emplace_back(dmn);
186216
}
187-
}
188-
// Select a random node to connect
189-
if (!pending.empty()) {
190-
dmnToConnect = pending[GetRandInt((int)pending.size())];
191-
LogPrint(BCLog::NET_MN, "TierTwoConnMan::%s -- opening quorum connection to %s, service=%s\n",
192-
__func__, dmnToConnect->proTxHash.ToString(), dmnToConnect->pdmnState->addr.ToString());
217+
// Select a random node to connect
218+
if (!pending.empty()) {
219+
dmnToConnect = pending[GetRandInt((int) pending.size())];
220+
LogPrint(BCLog::NET_MN, "TierTwoConnMan::%s -- opening quorum connection to %s, service=%s\n",
221+
__func__, dmnToConnect->proTxHash.ToString(), dmnToConnect->pdmnState->addr.ToString());
222+
}
193223
}
194224

195225
// If no node was selected, let's try to probe nodes connection
196226
if (!dmnToConnect) {
227+
std::vector<CDeterministicMNCPtr> pending;
197228
for (auto it = masternodePendingProbes.begin(); it != masternodePendingProbes.end(); ) {
198229
auto dmn = mnList.GetMN(*it);
199230
if (!dmn) {

src/tiertwo/net_masternodes.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ class TierTwoConnMan
3939
// Returns true if the node has the same address as a MN.
4040
bool isMasternodeQuorumNode(const CNode* pnode);
4141

42+
// Add DMN to the pending connection list
43+
bool addPendingMasternode(const uint256& proTxHash);
44+
4245
// Adds the DMNs to the pending to probe list
4346
void addPendingProbeConnections(const std::set<uint256>& proTxHashes);
4447

0 commit comments

Comments
 (0)