@@ -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+
7181void 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) {
0 commit comments