Skip to content

Commit 219061e

Browse files
committed
[Refactor] Decouple SyncWithNode from CMasternodeSync::Process()
1 parent e1f3620 commit 219061e

File tree

2 files changed

+119
-112
lines changed

2 files changed

+119
-112
lines changed

src/masternode-sync.cpp

Lines changed: 113 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -283,143 +283,144 @@ void CMasternodeSync::Process()
283283

284284
std::vector<CNode*> vNodesCopy = g_connman->CopyNodeVector();
285285
for (CNode* pnode : vNodesCopy) {
286-
if (isRegTestNet) {
287-
if (RequestedMasternodeAttempt <= 2) {
288-
pnode->PushMessage(NetMsgType::GETSPORKS); //get current network sporks
289-
} else if (RequestedMasternodeAttempt < 4) {
290-
mnodeman.DsegUpdate(pnode);
291-
} else if (RequestedMasternodeAttempt < 6) {
292-
int nMnCount = mnodeman.CountEnabled();
293-
pnode->PushMessage(NetMsgType::GETMNWINNERS, nMnCount); //sync payees
294-
uint256 n;
295-
pnode->PushMessage(NetMsgType::BUDGETVOTESYNC, n); //sync masternode votes
296-
} else {
297-
RequestedMasternodeAssets = MASTERNODE_SYNC_FINISHED;
298-
}
299-
RequestedMasternodeAttempt++;
286+
if (!SyncWithNode(pnode, isRegTestNet)) {
300287
g_connman->ReleaseNodeVector(vNodesCopy);
301288
return;
302289
}
290+
}
291+
g_connman->ReleaseNodeVector(vNodesCopy);
292+
}
303293

304-
//set to synced
305-
if (RequestedMasternodeAssets == MASTERNODE_SYNC_SPORKS) {
306-
if (pnode->HasFulfilledRequest("getspork")) continue;
307-
pnode->FulfilledRequest("getspork");
308-
294+
bool CMasternodeSync::SyncWithNode(CNode* pnode, bool isRegTestNet)
295+
{
296+
if (isRegTestNet) {
297+
if (RequestedMasternodeAttempt <= 2) {
309298
pnode->PushMessage(NetMsgType::GETSPORKS); //get current network sporks
310-
if (RequestedMasternodeAttempt >= 2) GetNextAsset();
311-
RequestedMasternodeAttempt++;
312-
g_connman->ReleaseNodeVector(vNodesCopy);
313-
return;
299+
} else if (RequestedMasternodeAttempt < 4) {
300+
mnodeman.DsegUpdate(pnode);
301+
} else if (RequestedMasternodeAttempt < 6) {
302+
int nMnCount = mnodeman.CountEnabled();
303+
pnode->PushMessage(NetMsgType::GETMNWINNERS, nMnCount); //sync payees
304+
uint256 n;
305+
pnode->PushMessage(NetMsgType::BUDGETVOTESYNC, n); //sync masternode votes
306+
} else {
307+
RequestedMasternodeAssets = MASTERNODE_SYNC_FINISHED;
314308
}
309+
RequestedMasternodeAttempt++;
310+
return false;
311+
}
315312

316-
if (pnode->nVersion >= masternodePayments.GetMinMasternodePaymentsProto()) {
317-
if (RequestedMasternodeAssets == MASTERNODE_SYNC_LIST) {
318-
LogPrint(BCLog::MASTERNODE, "CMasternodeSync::Process() - lastMasternodeList %lld (GetTime() - MASTERNODE_SYNC_TIMEOUT) %lld\n", lastMasternodeList, GetTime() - MASTERNODE_SYNC_TIMEOUT);
319-
if (lastMasternodeList > 0 && lastMasternodeList < GetTime() - MASTERNODE_SYNC_TIMEOUT * 2 && RequestedMasternodeAttempt >= MASTERNODE_SYNC_THRESHOLD) { //hasn't received a new item in the last five seconds, so we'll move to the
320-
GetNextAsset();
321-
g_connman->ReleaseNodeVector(vNodesCopy);
322-
return;
323-
}
324-
325-
if (pnode->HasFulfilledRequest("mnsync")) continue;
326-
pnode->FulfilledRequest("mnsync");
327-
328-
// timeout
329-
if (lastMasternodeList == 0 &&
330-
(RequestedMasternodeAttempt >= MASTERNODE_SYNC_THRESHOLD * 3 || GetTime() - nAssetSyncStarted > MASTERNODE_SYNC_TIMEOUT * 5)) {
331-
if (sporkManager.IsSporkActive(SPORK_8_MASTERNODE_PAYMENT_ENFORCEMENT)) {
332-
LogPrintf("CMasternodeSync::Process - ERROR - Sync has failed on %s, will retry later\n", "MASTERNODE_SYNC_LIST");
333-
RequestedMasternodeAssets = MASTERNODE_SYNC_FAILED;
334-
RequestedMasternodeAttempt = 0;
335-
lastFailure = GetTime();
336-
nCountFailures++;
337-
} else {
338-
GetNextAsset();
339-
}
340-
g_connman->ReleaseNodeVector(vNodesCopy);
341-
return;
342-
}
313+
//set to synced
314+
if (RequestedMasternodeAssets == MASTERNODE_SYNC_SPORKS) {
315+
if (pnode->HasFulfilledRequest("getspork")) return true;
316+
pnode->FulfilledRequest("getspork");
343317

344-
if (RequestedMasternodeAttempt >= MASTERNODE_SYNC_THRESHOLD * 3) return;
318+
pnode->PushMessage(NetMsgType::GETSPORKS); //get current network sporks
319+
if (RequestedMasternodeAttempt >= 2) GetNextAsset();
320+
RequestedMasternodeAttempt++;
321+
return false;
322+
}
345323

346-
mnodeman.DsegUpdate(pnode);
347-
RequestedMasternodeAttempt++;
348-
g_connman->ReleaseNodeVector(vNodesCopy);
349-
return;
324+
if (pnode->nVersion >= masternodePayments.GetMinMasternodePaymentsProto()) {
325+
if (RequestedMasternodeAssets == MASTERNODE_SYNC_LIST) {
326+
LogPrint(BCLog::MASTERNODE, "CMasternodeSync::Process() - lastMasternodeList %lld (GetTime() - MASTERNODE_SYNC_TIMEOUT) %lld\n", lastMasternodeList, GetTime() - MASTERNODE_SYNC_TIMEOUT);
327+
if (lastMasternodeList > 0 && lastMasternodeList < GetTime() - MASTERNODE_SYNC_TIMEOUT * 2 && RequestedMasternodeAttempt >= MASTERNODE_SYNC_THRESHOLD) { //hasn't received a new item in the last five seconds, so we'll move to the
328+
GetNextAsset();
329+
return false;
350330
}
351331

352-
if (RequestedMasternodeAssets == MASTERNODE_SYNC_MNW) {
353-
if (lastMasternodeWinner > 0 && lastMasternodeWinner < GetTime() - MASTERNODE_SYNC_TIMEOUT * 2 && RequestedMasternodeAttempt >= MASTERNODE_SYNC_THRESHOLD) { //hasn't received a new item in the last five seconds, so we'll move to the
332+
if (pnode->HasFulfilledRequest("mnsync")) return true;
333+
pnode->FulfilledRequest("mnsync");
334+
335+
// timeout
336+
if (lastMasternodeList == 0 &&
337+
(RequestedMasternodeAttempt >= MASTERNODE_SYNC_THRESHOLD * 3 || GetTime() - nAssetSyncStarted > MASTERNODE_SYNC_TIMEOUT * 5)) {
338+
if (sporkManager.IsSporkActive(SPORK_8_MASTERNODE_PAYMENT_ENFORCEMENT)) {
339+
LogPrintf("CMasternodeSync::Process - ERROR - Sync has failed on %s, will retry later\n", "MASTERNODE_SYNC_LIST");
340+
RequestedMasternodeAssets = MASTERNODE_SYNC_FAILED;
341+
RequestedMasternodeAttempt = 0;
342+
lastFailure = GetTime();
343+
nCountFailures++;
344+
} else {
354345
GetNextAsset();
355-
g_connman->ReleaseNodeVector(vNodesCopy);
356-
return;
357346
}
347+
return false;
348+
}
358349

359-
if (pnode->HasFulfilledRequest("mnwsync")) continue;
360-
pnode->FulfilledRequest("mnwsync");
361-
362-
// timeout
363-
if (lastMasternodeWinner == 0 &&
364-
(RequestedMasternodeAttempt >= MASTERNODE_SYNC_THRESHOLD * 3 || GetTime() - nAssetSyncStarted > MASTERNODE_SYNC_TIMEOUT * 5)) {
365-
if (sporkManager.IsSporkActive(SPORK_8_MASTERNODE_PAYMENT_ENFORCEMENT)) {
366-
LogPrintf("CMasternodeSync::Process - ERROR - Sync has failed on %s, will retry later\n", "MASTERNODE_SYNC_MNW");
367-
RequestedMasternodeAssets = MASTERNODE_SYNC_FAILED;
368-
RequestedMasternodeAttempt = 0;
369-
lastFailure = GetTime();
370-
nCountFailures++;
371-
} else {
372-
GetNextAsset();
373-
}
374-
g_connman->ReleaseNodeVector(vNodesCopy);
375-
return;
376-
}
350+
if (RequestedMasternodeAttempt >= MASTERNODE_SYNC_THRESHOLD * 3) return false;
377351

378-
if (RequestedMasternodeAttempt >= MASTERNODE_SYNC_THRESHOLD * 3) return;
352+
mnodeman.DsegUpdate(pnode);
353+
RequestedMasternodeAttempt++;
354+
return false;
355+
}
379356

380-
int nMnCount = mnodeman.CountEnabled();
381-
pnode->PushMessage(NetMsgType::GETMNWINNERS, nMnCount); //sync payees
382-
RequestedMasternodeAttempt++;
383-
g_connman->ReleaseNodeVector(vNodesCopy);
384-
return;
357+
if (RequestedMasternodeAssets == MASTERNODE_SYNC_MNW) {
358+
if (lastMasternodeWinner > 0 && lastMasternodeWinner < GetTime() - MASTERNODE_SYNC_TIMEOUT * 2 && RequestedMasternodeAttempt >= MASTERNODE_SYNC_THRESHOLD) { //hasn't received a new item in the last five seconds, so we'll move to the
359+
GetNextAsset();
360+
return false;
385361
}
386-
}
387362

388-
if (pnode->nVersion >= ActiveProtocol()) {
389-
if (RequestedMasternodeAssets == MASTERNODE_SYNC_BUDGET) {
390-
// We'll start rejecting votes if we accidentally get set as synced too soon
391-
if (lastBudgetItem > 0 && lastBudgetItem < GetTime() - MASTERNODE_SYNC_TIMEOUT * 2 && RequestedMasternodeAttempt >= MASTERNODE_SYNC_THRESHOLD) {
392-
// Hasn't received a new item in the last five seconds, so we'll move to the
363+
if (pnode->HasFulfilledRequest("mnwsync")) return true;
364+
pnode->FulfilledRequest("mnwsync");
365+
366+
// timeout
367+
if (lastMasternodeWinner == 0 &&
368+
(RequestedMasternodeAttempt >= MASTERNODE_SYNC_THRESHOLD * 3 || GetTime() - nAssetSyncStarted > MASTERNODE_SYNC_TIMEOUT * 5)) {
369+
if (sporkManager.IsSporkActive(SPORK_8_MASTERNODE_PAYMENT_ENFORCEMENT)) {
370+
LogPrintf("CMasternodeSync::Process - ERROR - Sync has failed on %s, will retry later\n", "MASTERNODE_SYNC_MNW");
371+
RequestedMasternodeAssets = MASTERNODE_SYNC_FAILED;
372+
RequestedMasternodeAttempt = 0;
373+
lastFailure = GetTime();
374+
nCountFailures++;
375+
} else {
393376
GetNextAsset();
394-
395-
// Try to activate our masternode if possible
396-
activeMasternode.ManageStatus();
397-
g_connman->ReleaseNodeVector(vNodesCopy);
398-
return;
399377
}
378+
return false;
379+
}
400380

401-
// timeout
402-
if (lastBudgetItem == 0 &&
403-
(RequestedMasternodeAttempt >= MASTERNODE_SYNC_THRESHOLD * 3 || GetTime() - nAssetSyncStarted > MASTERNODE_SYNC_TIMEOUT * 5)) {
404-
// maybe there is no budgets at all, so just finish syncing
405-
GetNextAsset();
406-
activeMasternode.ManageStatus();
407-
g_connman->ReleaseNodeVector(vNodesCopy);
408-
return;
409-
}
381+
if (RequestedMasternodeAttempt >= MASTERNODE_SYNC_THRESHOLD * 3) return false;
382+
383+
int nMnCount = mnodeman.CountEnabled();
384+
pnode->PushMessage(NetMsgType::GETMNWINNERS, nMnCount); //sync payees
385+
RequestedMasternodeAttempt++;
386+
return false;
387+
}
388+
}
410389

411-
if (pnode->HasFulfilledRequest("busync")) continue;
412-
pnode->FulfilledRequest("busync");
390+
if (pnode->nVersion >= ActiveProtocol()) {
391+
if (RequestedMasternodeAssets == MASTERNODE_SYNC_BUDGET) {
392+
// We'll start rejecting votes if we accidentally get set as synced too soon
393+
if (lastBudgetItem > 0 && lastBudgetItem < GetTime() - MASTERNODE_SYNC_TIMEOUT * 2 && RequestedMasternodeAttempt >= MASTERNODE_SYNC_THRESHOLD) {
394+
// Hasn't received a new item in the last five seconds, so we'll move to the
395+
GetNextAsset();
413396

414-
if (RequestedMasternodeAttempt >= MASTERNODE_SYNC_THRESHOLD * 3) return;
397+
// Try to activate our masternode if possible
398+
activeMasternode.ManageStatus();
399+
return false;
400+
}
415401

416-
uint256 n;
417-
pnode->PushMessage(NetMsgType::BUDGETVOTESYNC, n); //sync masternode votes
418-
RequestedMasternodeAttempt++;
419-
g_connman->ReleaseNodeVector(vNodesCopy);
420-
return;
402+
// timeout
403+
if (lastBudgetItem == 0 &&
404+
(RequestedMasternodeAttempt >= MASTERNODE_SYNC_THRESHOLD * 3 || GetTime() - nAssetSyncStarted > MASTERNODE_SYNC_TIMEOUT * 5)) {
405+
// maybe there is no budgets at all, so just finish syncing
406+
GetNextAsset();
407+
activeMasternode.ManageStatus();
408+
return false;
421409
}
410+
411+
if (pnode->HasFulfilledRequest("busync")) return true;
412+
pnode->FulfilledRequest("busync");
413+
414+
if (RequestedMasternodeAttempt >= MASTERNODE_SYNC_THRESHOLD * 3) return false;
415+
416+
uint256 n;
417+
pnode->PushMessage(NetMsgType::BUDGETVOTESYNC, n); //sync masternode votes
418+
RequestedMasternodeAttempt++;
419+
return false;
422420
}
423421
}
424-
g_connman->ReleaseNodeVector(vNodesCopy);
422+
423+
return true;
425424
}
425+
426+

src/masternode-sync.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,12 @@ class CMasternodeSync
7575

7676
void Reset();
7777
void Process();
78+
/*
79+
* Process sync with a single node.
80+
* If it returns false, the Process() step is complete.
81+
* Otherwise Process() calls it again for a different node.
82+
*/
83+
bool SyncWithNode(CNode* pnode, bool isRegTestNet);
7884
bool IsSynced();
7985
bool NotCompleted();
8086
bool IsSporkListSynced();

0 commit comments

Comments
 (0)