From 91eda7e21c7fd3c12d4cf6bb2d518748abbf8786 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Fri, 17 Jul 2015 12:17:15 +0300 Subject: [PATCH] Few sync improvements: - do not call Added....() inside CMasternodeSync::Process() - that was "faking" sync process - unify "RequestedMasternodeAttempt <= ..." logic and define MASTERNODE_SYNC_TIMEOUT - add missing masternodeSync.AddedMasternodeList() to CMasternodeMan::ProcessMessage() - fix "include"s - don't check vecMasternodesUsed while not synced --- src/darksend.cpp | 23 +++---- src/masternode-sync.cpp | 136 ++++++++++++++++++++-------------------- src/masternode-sync.h | 13 +--- src/masternodeman.cpp | 1 + 4 files changed, 79 insertions(+), 94 deletions(-) diff --git a/src/darksend.cpp b/src/darksend.cpp index 6ea78dab8819..1914a61b6e3d 100644 --- a/src/darksend.cpp +++ b/src/darksend.cpp @@ -2327,16 +2327,7 @@ void ThreadCheckDarkSendPool() MilliSleep(1000); //LogPrintf("ThreadCheckDarkSendPool::check timeout\n"); - if(c % 60 == 0){ - //if we've used 90% of the Masternode list then drop all the oldest. - int nThreshold = (int)(mnodeman.CountEnabled() * 0.9); - if(fDebug) LogPrintf("Checking vecMasternodesUsed size %d threshold %d\n", (int)vecMasternodesUsed.size(), nThreshold); - while((int)vecMasternodesUsed.size() > nThreshold){ - vecMasternodesUsed.erase(vecMasternodesUsed.begin()); - if(fDebug) LogPrintf(" vecMasternodesUsed size %d threshold %d\n", (int)vecMasternodesUsed.size(), nThreshold); - } - } - + // try to sync from all available nodes (up to 3 or until MASTERNODE_SYNC_TIMEOUT) one step at a time masternodeSync.Process(); if(masternodeSync.IsSynced()) { @@ -2354,12 +2345,14 @@ void ThreadCheckDarkSendPool() mnodeman.ProcessMasternodeConnections(); masternodePayments.CleanPaymentList(); CleanTransactionLocksList(); - } - if(c % 60 == 0){ - //if we've used 1/5 of the Masternode list, then clear the list. - if((int)vecMasternodesUsed.size() > (int)mnodeman.size() / 5) - vecMasternodesUsed.clear(); + //if we've used 90% of the Masternode list then drop all the oldest. + int nThreshold = (int)(mnodeman.CountEnabled() * 0.9); + if(fDebug) LogPrintf("Checking vecMasternodesUsed size %d threshold %d\n", (int)vecMasternodesUsed.size(), nThreshold); + while((int)vecMasternodesUsed.size() > nThreshold){ + vecMasternodesUsed.erase(vecMasternodesUsed.begin()); + if(fDebug) LogPrintf(" vecMasternodesUsed size %d threshold %d\n", (int)vecMasternodesUsed.size(), nThreshold); + } } if(c % MASTERNODES_DUMP_SECONDS == 0) DumpMasternodes(); diff --git a/src/masternode-sync.cpp b/src/masternode-sync.cpp index ebb1e0943986..65203e3857b9 100644 --- a/src/masternode-sync.cpp +++ b/src/masternode-sync.cpp @@ -3,10 +3,9 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "main.h" -#include "init.h" - #include "masternode-sync.h" #include "masternode.h" +#include "masternodeman.h" #include "util.h" #include "addrman.h" @@ -15,11 +14,10 @@ CMasternodeSync masternodeSync; CMasternodeSync::CMasternodeSync() { - c = 0; lastMasternodeList = 0; lastMasternodeWinner = 0; lastBudgetItem = 0; - RequestedMasternodeAssets = 0; + RequestedMasternodeAssets = MASTERNODE_INITIAL; RequestedMasternodeAttempt = 0; } @@ -63,96 +61,98 @@ void CMasternodeSync::GetNextAsset() RequestedMasternodeAssets = MASTERNODE_LIST_SYNCED; break; } + RequestedMasternodeAttempt = 0; } -void CMasternodeSync::Process() +void CMasternodeSync::Process() { + static int c = 0; + if(IsSynced()) return; + if(c++ % MASTERNODE_SYNC_TIMEOUT != 0) return; + + if(fDebug) LogPrintf("CMasternodeSync::Process() - RequestedMasternodeAssets %d c %d\n", RequestedMasternodeAssets, c); + //request full mn list only if Masternodes.dat was updated quite a long time ago if(RequestedMasternodeAssets == MASTERNODE_INITIAL) GetNextAsset(); CBlockIndex* pindexPrev = chainActive.Tip(); if(pindexPrev == NULL) return; - //try to sync the Masternode list and payment list every 5 seconds from at least 3 nodes - if(c % 5 == 0){ - LOCK(cs_vNodes); - BOOST_FOREACH(CNode* pnode, vNodes) + LOCK(cs_vNodes); + BOOST_FOREACH(CNode* pnode, vNodes) + { + if (pnode->nVersion >= MIN_POOL_PEER_PROTO_VERSION) { - if (pnode->nVersion >= MIN_POOL_PEER_PROTO_VERSION) - { - - if(RequestedMasternodeAssets == MASTERNODE_SPORK_SETTINGS){ - if(pnode->HasFulfilledRequest("getspork")) continue; - pnode->FulfilledRequest("getspork"); - - if(RequestedMasternodeAttempt <= 2){ - pnode->PushMessage("getsporks"); //get current network sporks - if(RequestedMasternodeAttempt == 2) GetNextAsset(); - RequestedMasternodeAttempt++; - } - return; - } - if(IsInitialBlockDownload()) return; + if(RequestedMasternodeAssets == MASTERNODE_SPORK_SETTINGS){ + if(pnode->HasFulfilledRequest("getspork")) continue; + pnode->FulfilledRequest("getspork"); - if(RequestedMasternodeAssets == MASTERNODE_SYNC_LIST){ - if(lastMasternodeList > 0 && lastMasternodeList < GetTime() - 5){ //hasn't received a new item in the last five seconds, so we'll move to the - GetNextAsset(); - return; - } + if(RequestedMasternodeAttempt <= 2){ + pnode->PushMessage("getsporks"); //get current network sporks + if(RequestedMasternodeAttempt == 2) GetNextAsset(); + RequestedMasternodeAttempt++; + } + return; + } - if(pnode->HasFulfilledRequest("mnsync")) continue; - pnode->FulfilledRequest("mnsync"); + if(IsInitialBlockDownload()) return; - if((lastMasternodeList == 0 || lastMasternodeList > GetTime() - 5) && RequestedMasternodeAttempt <= 4){ - mnodeman.DsegUpdate(pnode); - pnode->PushMessage("getsporks"); //get current network sporks - AddedMasternodeList(); - RequestedMasternodeAttempt++; - } + if(RequestedMasternodeAssets == MASTERNODE_SYNC_LIST){ + if(lastMasternodeList > 0 && lastMasternodeList < GetTime() - MASTERNODE_SYNC_TIMEOUT){ //hasn't received a new item in the last five seconds, so we'll move to the + GetNextAsset(); return; } - if(RequestedMasternodeAssets == MASTERNODE_SYNC_MNW){ - if(lastMasternodeWinner > 0 && lastMasternodeWinner < GetTime() - 5){ //hasn't received a new item in the last five seconds, so we'll move to the - GetNextAsset(); - return; - } + if(pnode->HasFulfilledRequest("mnsync")) continue; + pnode->FulfilledRequest("mnsync"); - if(pnode->HasFulfilledRequest("mnwsync")) continue; - pnode->FulfilledRequest("mnwsync"); + if((lastMasternodeList == 0 || lastMasternodeList > GetTime() - MASTERNODE_SYNC_TIMEOUT) + && RequestedMasternodeAttempt <= 2){ + mnodeman.DsegUpdate(pnode); + RequestedMasternodeAttempt++; + } + return; + } - if((lastMasternodeWinner == 0 || lastMasternodeWinner > GetTime() - 5) && RequestedMasternodeAttempt <= 6){ - pnode->PushMessage("mnget"); //sync payees - AddedMasternodeWinner(); - RequestedMasternodeAttempt++; - } + if(RequestedMasternodeAssets == MASTERNODE_SYNC_MNW){ + if(lastMasternodeWinner > 0 && lastMasternodeWinner < GetTime() - MASTERNODE_SYNC_TIMEOUT){ //hasn't received a new item in the last five seconds, so we'll move to the + GetNextAsset(); return; } - - if(RequestedMasternodeAssets == MASTERNODE_SYNC_BUDGET){ - if(lastBudgetItem > 0 && lastBudgetItem < GetTime() - 5){ //hasn't received a new item in the last five seconds, so we'll move to the - GetNextAsset(); - return; - } - - if(pnode->HasFulfilledRequest("busync")) continue; - pnode->FulfilledRequest("busync"); - - if((lastBudgetItem == 0 || lastBudgetItem > GetTime() - 5) && RequestedMasternodeAttempt <= 8){ - uint256 n = 0; - - pnode->PushMessage("mnvs", n); //sync masternode votes - AddedBudgetItem(); - RequestedMasternodeAttempt++; - } + + if(pnode->HasFulfilledRequest("mnwsync")) continue; + pnode->FulfilledRequest("mnwsync"); + + if((lastMasternodeWinner == 0 || lastMasternodeWinner > GetTime() - MASTERNODE_SYNC_TIMEOUT) + && RequestedMasternodeAttempt <= 2){ + pnode->PushMessage("mnget"); //sync payees + RequestedMasternodeAttempt++; + } + return; + } + + if(RequestedMasternodeAssets == MASTERNODE_SYNC_BUDGET){ + if(lastBudgetItem > 0 && lastBudgetItem < GetTime() - MASTERNODE_SYNC_TIMEOUT){ //hasn't received a new item in the last five seconds, so we'll move to the + GetNextAsset(); return; } + if(pnode->HasFulfilledRequest("busync")) continue; + pnode->FulfilledRequest("busync"); + + if((lastBudgetItem == 0 || lastBudgetItem > GetTime() - MASTERNODE_SYNC_TIMEOUT) + && RequestedMasternodeAttempt <= 2){ + uint256 n = 0; + + pnode->PushMessage("mnvs", n); //sync masternode votes + RequestedMasternodeAttempt++; + } + return; } + } } - c++; -} \ No newline at end of file +} diff --git a/src/masternode-sync.h b/src/masternode-sync.h index 178049d7da6a..caa2bb5186fa 100644 --- a/src/masternode-sync.h +++ b/src/masternode-sync.h @@ -5,16 +5,6 @@ #ifndef MASTERNODE_SYNC_H #define MASTERNODE_SYNC_H -#include "main.h" -#include "sync.h" -#include "net.h" -#include "key.h" -#include "masternodeman.h" -#include "util.h" -#include "base58.h" - -using namespace std; - #define MASTERNODE_INITIAL 0 #define MASTERNODE_SPORK_SETTINGS 1 #define MASTERNODE_SYNC_LIST 2 @@ -22,6 +12,8 @@ using namespace std; #define MASTERNODE_SYNC_BUDGET 4 #define MASTERNODE_LIST_SYNCED 999 +#define MASTERNODE_SYNC_TIMEOUT 5 + class CMasternodeSync; extern CMasternodeSync masternodeSync; @@ -32,7 +24,6 @@ extern CMasternodeSync masternodeSync; class CMasternodeSync { public: - int c; int64_t lastMasternodeList; int64_t lastMasternodeWinner; int64_t lastBudgetItem; diff --git a/src/masternodeman.cpp b/src/masternodeman.cpp index cfe14e78c0b8..ec2bc8fa1dcf 100644 --- a/src/masternodeman.cpp +++ b/src/masternodeman.cpp @@ -603,6 +603,7 @@ void CMasternodeMan::ProcessMessage(CNode* pfrom, std::string& strCommand, CData if(mnb.CheckInputsAndAdd(nDoS)) { // use this as a peer addrman.Add(CAddress(mnb.addr), pfrom->addr, 2*60*60); + masternodeSync.AddedMasternodeList(); } else { LogPrintf("mnb - Rejected Masternode entry %s\n", mnb.addr.ToString());