77#include < evo/deterministicmns.h>
88#include < llmq/commitment.h>
99#include < llmq/options.h>
10- #include < llmq/quorumsman .h>
10+ #include < llmq/quorums .h>
1111#include < llmq/utils.h>
1212#include < masternode/sync.h>
13+ #include < msg_result.h>
14+ #include < unordered_lru_cache.h>
1315
1416#include < chain.h>
1517#include < chainparams.h>
2022#include < cxxtimer.hpp>
2123
2224namespace llmq {
23- QuorumObserver::QuorumObserver (CConnman& connman, CDeterministicMNManager& dmnman, CQuorumManager & qman,
25+ QuorumObserver::QuorumObserver (CConnman& connman, CDeterministicMNManager& dmnman, QuorumObserverParent & qman,
2426 CQuorumSnapshotManager& qsnapman, const ChainstateManager& chainman,
2527 const CMasternodeSync& mn_sync, const CSporkManager& sporkman,
2628 const llmq::QvvecSyncModeMap& sync_map, bool quorums_recovery) :
@@ -66,18 +68,8 @@ void QuorumObserver::UpdatedBlockTip(const CBlockIndex* pindexNew, bool fInitial
6668 CheckQuorumConnections (params, pindexNew);
6769 }
6870
69- {
70- // Cleanup expired data requests
71- LOCK (m_qman.cs_data_requests );
72- auto it = m_qman.mapQuorumDataRequests .begin ();
73- while (it != m_qman.mapQuorumDataRequests .end ()) {
74- if (it->second .IsExpired (/* add_bias=*/ true )) {
75- it = m_qman.mapQuorumDataRequests .erase (it);
76- } else {
77- ++it;
78- }
79- }
80- }
71+ // Cleanup expired data requests
72+ m_qman.CleanupExpiredDataRequests ();
8173
8274 TriggerQuorumDataRecoveryThreads (pindexNew);
8375 StartCleanupOldQuorumDataThread (pindexNew);
@@ -230,14 +222,10 @@ void QuorumObserver::DataRecoveryThread(gsl::not_null<const CBlockIndex*> block_
230222 }
231223 // Access the member list of the quorum with the calculated offset applied to balance the load equally
232224 pCurrentMemberHash = &vecMemberHashes[(start_offset + nTries++) % vecMemberHashes.size ()];
233- {
234- LOCK (m_qman.cs_data_requests );
235- const CQuorumDataRequestKey key (*pCurrentMemberHash, true , pQuorum->qc ->quorumHash , pQuorum->qc ->llmqType );
236- auto it = m_qman.mapQuorumDataRequests .find (key);
237- if (it != m_qman.mapQuorumDataRequests .end () && !it->second .IsExpired (/* add_bias=*/ true )) {
238- printLog (" Already asked" );
239- continue ;
240- }
225+ if (m_qman.IsDataRequestPending (*pCurrentMemberHash, /* we_requested=*/ true , pQuorum->qc ->quorumHash ,
226+ pQuorum->qc ->llmqType )) {
227+ printLog (" Already asked" );
228+ continue ;
241229 }
242230 // Sleep a bit depending on the start offset to balance out multiple requests to same masternode
243231 quorumThreadInterrupt.sleep_for (std::chrono::milliseconds (start_offset * 100 ));
@@ -256,20 +244,20 @@ void QuorumObserver::DataRecoveryThread(gsl::not_null<const CBlockIndex*> block_
256244 nTimeLastSuccess = GetTime<std::chrono::seconds>().count ();
257245 printLog (" Requested" );
258246 } else {
259- LOCK ( m_qman.cs_data_requests );
260- const CQuorumDataRequestKey key (*pCurrentMemberHash, true , pQuorum->qc ->quorumHash , pQuorum->qc ->llmqType );
261- auto it = m_qman. mapQuorumDataRequests . find (key);
262- if (it == m_qman. mapQuorumDataRequests . end ()) {
247+ const auto status = m_qman.GetDataRequestStatus (*pCurrentMemberHash, /* we_requested= */ true ,
248+ pQuorum->qc ->quorumHash , pQuorum->qc ->llmqType );
249+ switch (status) {
250+ case DataRequestStatus::NotFound:
263251 printLog (" Failed" );
264252 pNode->fDisconnect = true ;
265253 pCurrentMemberHash = nullptr ;
266254 return ;
267- } else if (it-> second . IsProcessed ()) {
255+ case DataRequestStatus::Processed:
268256 printLog (" Processed" );
269257 pNode->fDisconnect = true ;
270258 pCurrentMemberHash = nullptr ;
271259 return ;
272- } else {
260+ case DataRequestStatus::Pending:
273261 printLog (" Waiting" );
274262 return ;
275263 }
@@ -376,7 +364,7 @@ void QuorumObserver::StartCleanupOldQuorumDataThread(gsl::not_null<const CBlockI
376364 }
377365
378366 if (!quorumThreadInterrupt) {
379- WITH_LOCK ( m_qman.cs_db , DataCleanupHelper (*m_qman. db , dbKeysToSkip) );
367+ m_qman.CleanupOldQuorumData ( dbKeysToSkip);
380368 }
381369
382370 LogPrint (BCLog::LLMQ, " QuorumObserver::StartCleanupOldQuorumDataThread -- done. time=%d\n " , t.count ());
0 commit comments