Skip to content

Commit 5a10177

Browse files
committed
Split mn list/single vin logic for DSEG
This should prevent looping till the end of the list if we were asked for a single mn and a) we have it but some following `if` has failed or b) we don't have it. It also should be a bit easier to follow the logic this way.
1 parent 5d65800 commit 5a10177

File tree

2 files changed

+76
-46
lines changed

2 files changed

+76
-46
lines changed

src/masternodeman.cpp

Lines changed: 71 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -873,54 +873,11 @@ void CMasternodeMan::ProcessMessage(CNode* pfrom, const std::string& strCommand,
873873

874874
LOCK(cs);
875875

876-
if(vin == CTxIn()) { //only should ask for this once
877-
//local network
878-
bool isLocal = (pfrom->addr.IsRFC1918() || pfrom->addr.IsLocal());
879-
880-
if(!isLocal && Params().NetworkIDString() == CBaseChainParams::MAIN) {
881-
std::map<CNetAddr, int64_t>::iterator it = mAskedUsForMasternodeList.find(pfrom->addr);
882-
if (it != mAskedUsForMasternodeList.end() && it->second > GetTime()) {
883-
Misbehaving(pfrom->GetId(), 34);
884-
LogPrintf("DSEG -- peer already asked me for the list, peer=%d\n", pfrom->id);
885-
return;
886-
}
887-
int64_t askAgain = GetTime() + DSEG_UPDATE_SECONDS;
888-
mAskedUsForMasternodeList[pfrom->addr] = askAgain;
889-
}
890-
} //else, asking for a specific node which is ok
891-
892-
int nInvCount = 0;
893-
894-
for (const auto& mnpair : mapMasternodes) {
895-
if (vin != CTxIn() && vin != mnpair.second.vin) continue; // asked for specific vin but we are not there yet
896-
if (mnpair.second.addr.IsRFC1918() || mnpair.second.addr.IsLocal()) continue; // do not send local network masternode
897-
// NOTE: send masternode regardless of its current state, the other node will need it to verify old votes.
898-
899-
LogPrint("masternode", "DSEG -- Sending Masternode entry: masternode=%s addr=%s\n", mnpair.first.ToStringShort(), mnpair.second.addr.ToString());
900-
CMasternodeBroadcast mnb = CMasternodeBroadcast(mnpair.second);
901-
CMasternodePing mnp = mnpair.second.lastPing;
902-
uint256 hashMNB = mnb.GetHash();
903-
uint256 hashMNP = mnp.GetHash();
904-
pfrom->PushInventory(CInv(MSG_MASTERNODE_ANNOUNCE, hashMNB));
905-
pfrom->PushInventory(CInv(MSG_MASTERNODE_PING, hashMNP));
906-
nInvCount++;
907-
908-
mapSeenMasternodeBroadcast.insert(std::make_pair(hashMNB, std::make_pair(GetTime(), mnb)));
909-
mapSeenMasternodePing.insert(std::make_pair(hashMNP, mnp));
910-
911-
if (vin.prevout == mnpair.first) {
912-
LogPrintf("DSEG -- Sent 1 Masternode inv to peer=%d\n", pfrom->id);
913-
return;
914-
}
915-
}
916-
917876
if(vin == CTxIn()) {
918-
connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::SYNCSTATUSCOUNT, MASTERNODE_SYNC_LIST, nInvCount));
919-
LogPrintf("DSEG -- Sent %d Masternode invs to peer=%d\n", nInvCount, pfrom->id);
920-
return;
877+
SyncAll(pfrom, connman);
878+
} else {
879+
SyncSingle(pfrom, vin.prevout, connman);
921880
}
922-
// smth weird happen - someone asked us for vin we have no idea about?
923-
LogPrint("masternode", "DSEG -- No invs sent to peer=%d\n", pfrom->id);
924881

925882
} else if (strCommand == NetMsgType::MNVERIFY) { // Masternode Verify
926883

@@ -947,6 +904,74 @@ void CMasternodeMan::ProcessMessage(CNode* pfrom, const std::string& strCommand,
947904
}
948905
}
949906

907+
void CMasternodeMan::SyncSingle(CNode* pnode, const COutPoint& outpoint, CConnman& connman)
908+
{
909+
// do not provide any data until our node is synced
910+
if (!masternodeSync.IsSynced()) return;
911+
912+
LOCK(cs);
913+
914+
auto it = mapMasternodes.find(outpoint);
915+
916+
if(it != mapMasternodes.end()) {
917+
if (it->second.addr.IsRFC1918() || it->second.addr.IsLocal()) return; // do not send local network masternode
918+
// NOTE: send masternode regardless of its current state, the other node will need it to verify old votes.
919+
LogPrint("masternode", "CMasternodeMan::%s -- Sending Masternode entry: masternode=%s addr=%s\n", __func__, outpoint.ToStringShort(), it->second.addr.ToString());
920+
PushDsegInvs(pnode, it->second);
921+
LogPrintf("CMasternodeMan::%s -- Sent 1 Masternode inv to peer=%d\n", __func__, pnode->id);
922+
}
923+
}
924+
925+
void CMasternodeMan::SyncAll(CNode* pnode, CConnman& connman)
926+
{
927+
// do not provide any data until our node is synced
928+
if (!masternodeSync.IsSynced()) return;
929+
930+
LOCK(cs);
931+
932+
// local network
933+
bool isLocal = (pnode->addr.IsRFC1918() || pnode->addr.IsLocal());
934+
935+
// should only ask for this once
936+
if(!isLocal && Params().NetworkIDString() == CBaseChainParams::MAIN) {
937+
std::map<CNetAddr, int64_t>::iterator it = mAskedUsForMasternodeList.find(pnode->addr);
938+
if (it != mAskedUsForMasternodeList.end() && it->second > GetTime()) {
939+
Misbehaving(pnode->GetId(), 34);
940+
LogPrintf("CMasternodeMan::%s -- peer already asked me for the list, peer=%d\n", __func__, pnode->id);
941+
return;
942+
}
943+
int64_t askAgain = GetTime() + DSEG_UPDATE_SECONDS;
944+
mAskedUsForMasternodeList[pnode->addr] = askAgain;
945+
}
946+
947+
int nInvCount = 0;
948+
949+
for (const auto& mnpair : mapMasternodes) {
950+
if (mnpair.second.addr.IsRFC1918() || mnpair.second.addr.IsLocal()) continue; // do not send local network masternode
951+
// NOTE: send masternode regardless of its current state, the other node will need it to verify old votes.
952+
LogPrint("masternode", "CMasternodeMan::%s -- Sending Masternode entry: masternode=%s addr=%s\n", __func__, mnpair.first.ToStringShort(), mnpair.second.addr.ToString());
953+
PushDsegInvs(pnode, mnpair.second);
954+
nInvCount++;
955+
}
956+
957+
connman.PushMessage(pnode, CNetMsgMaker(pnode->GetSendVersion()).Make(NetMsgType::SYNCSTATUSCOUNT, MASTERNODE_SYNC_LIST, nInvCount));
958+
LogPrintf("CMasternodeMan::%s -- Sent %d Masternode invs to peer=%d\n", __func__, nInvCount, pnode->id);
959+
}
960+
961+
void CMasternodeMan::PushDsegInvs(CNode* pnode, const CMasternode& mn)
962+
{
963+
AssertLockHeld(cs);
964+
965+
CMasternodeBroadcast mnb(mn);
966+
CMasternodePing mnp = mnb.lastPing;
967+
uint256 hashMNB = mnb.GetHash();
968+
uint256 hashMNP = mnp.GetHash();
969+
pnode->PushInventory(CInv(MSG_MASTERNODE_ANNOUNCE, hashMNB));
970+
pnode->PushInventory(CInv(MSG_MASTERNODE_PING, hashMNP));
971+
mapSeenMasternodeBroadcast.insert(std::make_pair(hashMNB, std::make_pair(GetTime(), mnb)));
972+
mapSeenMasternodePing.insert(std::make_pair(hashMNP, mnp));
973+
}
974+
950975
// Verification of masternodes via unique direct requests.
951976

952977
void CMasternodeMan::DoFullVerificationStep(CConnman& connman)

src/masternodeman.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ class CMasternodeMan
8383

8484
bool GetMasternodeScores(const uint256& nBlockHash, score_pair_vec_t& vecMasternodeScoresRet, int nMinProtocol = 0);
8585

86+
void SyncSingle(CNode* pnode, const COutPoint& outpoint, CConnman& connman);
87+
void SyncAll(CNode* pnode, CConnman& connman);
88+
89+
void PushDsegInvs(CNode* pnode, const CMasternode& mn);
90+
8691
public:
8792
// Keep track of all broadcasts I've seen
8893
std::map<uint256, std::pair<int64_t, CMasternodeBroadcast> > mapSeenMasternodeBroadcast;

0 commit comments

Comments
 (0)