Skip to content

Commit 1905422

Browse files
authored
Rework govobject/trigger cleanup a bit (#3070)
* No friends for `CGovernanceObject` * Simplify CGovernanceTriggerManager::CleanAndRemove() logic and make sure CSuperblock::IsExpired() does not modify the state
1 parent 386de78 commit 1905422

File tree

5 files changed

+36
-44
lines changed

5 files changed

+36
-44
lines changed

src/governance/governance-classes.cpp

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ void CGovernanceTriggerManager::CleanAndRemove()
143143
CGovernanceObject* pObj = nullptr;
144144
CSuperblock_sptr& pSuperblock = it->second;
145145
if (!pSuperblock) {
146-
LogPrint(BCLog::GOBJECT, "CGovernanceTriggerManager::CleanAndRemove -- nullptr superblock marked for removal\n");
146+
LogPrint(BCLog::GOBJECT, "CGovernanceTriggerManager::CleanAndRemove -- nullptr superblock\n");
147147
remove = true;
148148
} else {
149149
pObj = governance.FindGovernanceObject(it->first);
@@ -160,9 +160,15 @@ void CGovernanceTriggerManager::CleanAndRemove()
160160
remove = true;
161161
break;
162162
case SEEN_OBJECT_IS_VALID:
163-
case SEEN_OBJECT_EXECUTED:
164-
remove = pSuperblock->IsExpired();
163+
case SEEN_OBJECT_EXECUTED: {
164+
LogPrint(BCLog::GOBJECT, "CGovernanceTriggerManager::CleanAndRemove -- Valid trigger found\n");
165+
if (pSuperblock->IsExpired()) {
166+
// update corresponding object
167+
pObj->SetExpired();
168+
remove = true;
169+
}
165170
break;
171+
}
166172
default:
167173
break;
168174
}
@@ -173,15 +179,10 @@ void CGovernanceTriggerManager::CleanAndRemove()
173179
std::string strDataAsPlainString = "nullptr";
174180
if (pObj) {
175181
strDataAsPlainString = pObj->GetDataAsPlainString();
182+
// mark corresponding object for deletion
183+
pObj->PrepareDeletion(GetAdjustedTime());
176184
}
177185
LogPrint(BCLog::GOBJECT, "CGovernanceTriggerManager::CleanAndRemove -- Removing trigger object %s\n", strDataAsPlainString);
178-
// mark corresponding object for deletion
179-
if (pObj) {
180-
pObj->fCachedDelete = true;
181-
if (pObj->nDeletionTime == 0) {
182-
pObj->nDeletionTime = GetAdjustedTime();
183-
}
184-
}
185186
// delete the trigger
186187
mapTrigger.erase(it++);
187188
} else {
@@ -662,9 +663,8 @@ bool CSuperblock::IsValid(const CTransaction& txNew, int nBlockHeight, CAmount b
662663
return true;
663664
}
664665

665-
bool CSuperblock::IsExpired()
666+
bool CSuperblock::IsExpired() const
666667
{
667-
bool fExpired{false};
668668
int nExpirationBlocks{0};
669669
// Executed triggers are kept for another superblock cycle (approximately 1 month),
670670
// other valid triggers are kept for ~1 day only, everything else is pruned after ~1h.
@@ -686,16 +686,10 @@ bool CSuperblock::IsExpired()
686686

687687
if (governance.GetCachedBlockHeight() > nExpirationBlock) {
688688
LogPrint(BCLog::GOBJECT, "CSuperblock::IsExpired -- Outdated trigger found\n");
689-
fExpired = true;
690-
CGovernanceObject* pgovobj = GetGovernanceObject();
691-
if (pgovobj) {
692-
LogPrint(BCLog::GOBJECT, "CSuperblock::IsExpired -- Expiring outdated object: %s\n", pgovobj->GetHash().ToString());
693-
pgovobj->fExpired = true;
694-
pgovobj->nDeletionTime = GetAdjustedTime();
695-
}
689+
return true;
696690
}
697691

698-
return fExpired;
692+
return false;
699693
}
700694

701695
/**

src/governance/governance-classes.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ class CSuperblock : public CGovernanceObject
172172
CAmount GetPaymentsTotalAmount();
173173

174174
bool IsValid(const CTransaction& txNew, int nBlockHeight, CAmount blockReward);
175-
bool IsExpired();
175+
bool IsExpired() const;
176176
};
177177

178178
#endif

src/governance/governance-object.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ void CGovernanceObject::ClearMasternodeVotes()
227227
if (!mnList.HasMNByCollateral(it->first)) {
228228
fileVotes.RemoveVotesFromMasternode(it->first);
229229
mapCurrentMNVotes.erase(it++);
230+
fDirtyCache = true;
230231
} else {
231232
++it;
232233
}

src/governance/governance-object.h

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,6 @@ struct vote_rec_t {
107107

108108
class CGovernanceObject
109109
{
110-
friend class CGovernanceManager;
111-
friend class CGovernanceTriggerManager;
112-
friend class CSuperblock;
113-
114110
public: // Types
115111
typedef std::map<COutPoint, vote_rec_t> vote_m_t;
116112

@@ -246,6 +242,11 @@ class CGovernanceObject
246242
return fExpired;
247243
}
248244

245+
void SetExpired()
246+
{
247+
fExpired = true;
248+
}
249+
249250
const CGovernanceObjectVoteFile& GetVoteFile() const
250251
{
251252
return fileVotes;
@@ -273,6 +274,14 @@ class CGovernanceObject
273274

274275
void UpdateSentinelVariables();
275276

277+
void PrepareDeletion(int64_t nDeletionTime_)
278+
{
279+
fCachedDelete = true;
280+
if (nDeletionTime == 0) {
281+
nDeletionTime = nDeletionTime_;
282+
}
283+
}
284+
276285
CAmount GetMinCollateralFee() const;
277286

278287
UniValue GetJSONObject();
@@ -329,7 +338,6 @@ class CGovernanceObject
329338
// AFTER DESERIALIZATION OCCURS, CACHED VARIABLES MUST BE CALCULATED MANUALLY
330339
}
331340

332-
private:
333341
// FUNCTIONS FOR DEALING WITH DATA STRING
334342
void LoadData();
335343
void GetData(UniValue& objResult);

src/governance/governance.cpp

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -310,16 +310,12 @@ void CGovernanceManager::AddGovernanceObject(CGovernanceObject& govobj, CConnman
310310
// SHOULD WE ADD THIS OBJECT TO ANY OTHER MANANGERS?
311311

312312
LogPrint(BCLog::GOBJECT, "CGovernanceManager::AddGovernanceObject -- Before trigger block, GetDataAsPlainString = %s, nObjectType = %d\n",
313-
govobj.GetDataAsPlainString(), govobj.nObjectType);
313+
govobj.GetDataAsPlainString(), govobj.GetObjectType());
314314

315-
if (govobj.nObjectType == GOVERNANCE_OBJECT_TRIGGER) {
315+
if (govobj.GetObjectType() == GOVERNANCE_OBJECT_TRIGGER) {
316316
if (!triggerman.AddNewTrigger(nHash)) {
317317
LogPrint(BCLog::GOBJECT, "CGovernanceManager::AddGovernanceObject -- undo adding invalid trigger object: hash = %s\n", nHash.ToString());
318-
CGovernanceObject& objref = objpair.first->second;
319-
objref.fCachedDelete = true;
320-
if (objref.nDeletionTime == 0) {
321-
objref.nDeletionTime = GetAdjustedTime();
322-
}
318+
objpair.first->second.PrepareDeletion(GetAdjustedTime());
323319
return;
324320
}
325321
}
@@ -355,7 +351,6 @@ void CGovernanceManager::UpdateCachesAndClean()
355351
continue;
356352
}
357353
it->second.ClearMasternodeVotes();
358-
it->second.fDirtyCache = true;
359354
}
360355

361356
ScopedLockBool guard(cs, fRateChecksEnabled, false);
@@ -429,10 +424,7 @@ void CGovernanceManager::UpdateCachesAndClean()
429424
CProposalValidator validator(pObj->GetDataAsHexString(), true);
430425
if (!validator.Validate()) {
431426
LogPrintf("CGovernanceManager::UpdateCachesAndClean -- set for deletion expired obj %s\n", strHash);
432-
pObj->fCachedDelete = true;
433-
if (pObj->nDeletionTime == 0) {
434-
pObj->nDeletionTime = nNow;
435-
}
427+
pObj->PrepareDeletion(nNow);
436428
}
437429
}
438430
++it;
@@ -999,7 +991,7 @@ int CGovernanceManager::RequestGovernanceObjectVotes(const std::vector<CNode*>&
999991
if (mapAskedRecently[nHash].size() >= nPeersPerHashMax) continue;
1000992
}
1001993

1002-
if (objPair.second.nObjectType == GOVERNANCE_OBJECT_TRIGGER) {
994+
if (objPair.second.GetObjectType() == GOVERNANCE_OBJECT_TRIGGER) {
1003995
vTriggerObjHashes.push_back(nHash);
1004996
} else {
1005997
vOtherObjHashes.push_back(nHash);
@@ -1107,15 +1099,12 @@ void CGovernanceManager::AddCachedTriggers()
11071099
for (auto& objpair : mapObjects) {
11081100
CGovernanceObject& govobj = objpair.second;
11091101

1110-
if (govobj.nObjectType != GOVERNANCE_OBJECT_TRIGGER) {
1102+
if (govobj.GetObjectType() != GOVERNANCE_OBJECT_TRIGGER) {
11111103
continue;
11121104
}
11131105

11141106
if (!triggerman.AddNewTrigger(govobj.GetHash())) {
1115-
govobj.fCachedDelete = true;
1116-
if (govobj.nDeletionTime == 0) {
1117-
govobj.nDeletionTime = GetAdjustedTime();
1118-
}
1107+
govobj.PrepareDeletion(GetAdjustedTime());
11191108
}
11201109
}
11211110
}

0 commit comments

Comments
 (0)