Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 8 additions & 15 deletions src/darksend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()) {
Expand All @@ -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();
Expand Down
136 changes: 68 additions & 68 deletions src/masternode-sync.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand All @@ -15,11 +14,10 @@ CMasternodeSync masternodeSync;

CMasternodeSync::CMasternodeSync()
{
c = 0;
lastMasternodeList = 0;
lastMasternodeWinner = 0;
lastBudgetItem = 0;
RequestedMasternodeAssets = 0;
RequestedMasternodeAssets = MASTERNODE_INITIAL;
RequestedMasternodeAttempt = 0;
}

Expand Down Expand Up @@ -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++;
}
}
13 changes: 2 additions & 11 deletions src/masternode-sync.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,15 @@
#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
#define MASTERNODE_SYNC_MNW 3
#define MASTERNODE_SYNC_BUDGET 4
#define MASTERNODE_LIST_SYNCED 999

#define MASTERNODE_SYNC_TIMEOUT 5

class CMasternodeSync;
extern CMasternodeSync masternodeSync;

Expand All @@ -32,7 +24,6 @@ extern CMasternodeSync masternodeSync;
class CMasternodeSync
{
public:
int c;
int64_t lastMasternodeList;
int64_t lastMasternodeWinner;
int64_t lastBudgetItem;
Expand Down
1 change: 1 addition & 0 deletions src/masternodeman.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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());

Expand Down