Improve small-network sync and build safety

This commit is contained in:
root
2026-05-02 07:07:02 +00:00
parent 83e0085a60
commit 37e006a65f
2 changed files with 247 additions and 4 deletions
+49 -2
View File
@@ -240,7 +240,7 @@ void CMasternodeSync::Process()
/*
Resync if we lose all masternodes from sleep/wake or failure to sync originally
*/
if (mnodeman.CountEnabled() == 0) {
if (mnodeman.CountEnabled() == 0 && IsSporkActive(SPORK_8_MASTERNODE_PAYMENT_ENFORCEMENT)) {
Reset();
} else
return;
@@ -261,6 +261,49 @@ void CMasternodeSync::Process()
if (Params().NetworkID() != CBaseChainParams::REGTEST &&
!IsBlockchainSynced() && RequestedMasternodeAssets > MASTERNODE_SYNC_SPORKS) return;
// Small networks can have every connected peer marked fulfilled before an
// empty masternode stage reaches its per-peer timeout check. Advance empty
// stages here so staking is not blocked forever on networks with no
// masternodes, winners, or budgets.
if (GetTime() - nAssetSyncStarted > MASTERNODE_SYNC_TIMEOUT * 5) {
if (RequestedMasternodeAssets == MASTERNODE_SYNC_SPORKS) {
GetNextAsset();
return;
}
if (RequestedMasternodeAssets == MASTERNODE_SYNC_LIST && lastMasternodeList == 0) {
if (IsSporkActive(SPORK_8_MASTERNODE_PAYMENT_ENFORCEMENT)) {
LogPrintf("CMasternodeSync::Process - ERROR - Sync has failed, will retry later\n");
RequestedMasternodeAssets = MASTERNODE_SYNC_FAILED;
RequestedMasternodeAttempt = 0;
lastFailure = GetTime();
nCountFailures++;
} else {
GetNextAsset();
}
return;
}
if (RequestedMasternodeAssets == MASTERNODE_SYNC_MNW && lastMasternodeWinner == 0) {
if (IsSporkActive(SPORK_8_MASTERNODE_PAYMENT_ENFORCEMENT)) {
LogPrintf("CMasternodeSync::Process - ERROR - Sync has failed, will retry later\n");
RequestedMasternodeAssets = MASTERNODE_SYNC_FAILED;
RequestedMasternodeAttempt = 0;
lastFailure = GetTime();
nCountFailures++;
} else {
GetNextAsset();
}
return;
}
if (RequestedMasternodeAssets == MASTERNODE_SYNC_BUDGET && lastBudgetItem == 0) {
GetNextAsset();
activeMasternode.ManageStatus();
return;
}
}
TRY_LOCK(cs_vNodes, lockRecv);
if (!lockRecv) return;
@@ -284,11 +327,15 @@ void CMasternodeSync::Process()
//set to synced
if (RequestedMasternodeAssets == MASTERNODE_SYNC_SPORKS) {
if (RequestedMasternodeAttempt >= MASTERNODE_SYNC_THRESHOLD) {
GetNextAsset();
return;
}
if (pnode->HasFulfilledRequest("getspork")) continue;
pnode->FulfilledRequest("getspork");
pnode->PushMessage("getsporks"); //get current network sporks
if (RequestedMasternodeAttempt >= 2) GetNextAsset();
RequestedMasternodeAttempt++;
return;