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 < unordered_lru_cache.h>
1314
1415#include < chain.h>
1516#include < chainparams.h>
2021#include < cxxtimer.hpp>
2122
2223namespace llmq {
23- QuorumObserver::QuorumObserver (CConnman& connman, CDeterministicMNManager& dmnman, CQuorumManager & qman,
24+ QuorumObserver::QuorumObserver (CConnman& connman, CDeterministicMNManager& dmnman, QuorumHandlerParent & qman,
2425 CQuorumSnapshotManager& qsnapman, const ChainstateManager& chainman,
2526 const CMasternodeSync& mn_sync, const CSporkManager& sporkman,
2627 const llmq::QvvecSyncModeMap& sync_map, bool quorums_recovery) :
@@ -66,18 +67,8 @@ void QuorumObserver::UpdatedBlockTip(const CBlockIndex* pindexNew, bool fInitial
6667 CheckQuorumConnections (params, pindexNew);
6768 }
6869
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- }
70+ // Cleanup expired data requests
71+ m_qman.CleanupExpiredDataRequests ();
8172
8273 TriggerQuorumDataRecoveryThreads (pindexNew);
8374 StartCleanupOldQuorumDataThread (pindexNew);
@@ -231,14 +222,10 @@ void QuorumObserver::DataRecoveryThread(gsl::not_null<const CBlockIndex*> block_
231222 }
232223 // Access the member list of the quorum with the calculated offset applied to balance the load equally
233224 pCurrentMemberHash = &vecMemberHashes[(start_offset + nTries++) % vecMemberHashes.size ()];
234- {
235- LOCK (m_qman.cs_data_requests );
236- const CQuorumDataRequestKey key (*pCurrentMemberHash, true , pQuorum->qc ->quorumHash , pQuorum->qc ->llmqType );
237- auto it = m_qman.mapQuorumDataRequests .find (key);
238- if (it != m_qman.mapQuorumDataRequests .end () && !it->second .IsExpired (/* add_bias=*/ true )) {
239- printLog (" Already asked" );
240- continue ;
241- }
225+ if (m_qman.IsDataRequestPending (*pCurrentMemberHash, /* we_requested=*/ true , pQuorum->qc ->quorumHash ,
226+ pQuorum->qc ->llmqType )) {
227+ printLog (" Already asked" );
228+ continue ;
242229 }
243230 // Sleep a bit depending on the start offset to balance out multiple requests to same masternode
244231 quorumThreadInterrupt.sleep_for (std::chrono::milliseconds (start_offset * 100 ));
@@ -257,20 +244,20 @@ void QuorumObserver::DataRecoveryThread(gsl::not_null<const CBlockIndex*> block_
257244 nTimeLastSuccess = GetTime<std::chrono::seconds>().count ();
258245 printLog (" Requested" );
259246 } else {
260- LOCK ( m_qman.cs_data_requests );
261- const CQuorumDataRequestKey key (*pCurrentMemberHash, true , pQuorum->qc ->quorumHash , pQuorum->qc ->llmqType );
262- auto it = m_qman. mapQuorumDataRequests . find (key);
263- 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:
264251 printLog (" Failed" );
265252 pNode->fDisconnect = true ;
266253 pCurrentMemberHash = nullptr ;
267254 return ;
268- } else if (it-> second . IsProcessed ()) {
255+ case DataRequestStatus::Processed:
269256 printLog (" Processed" );
270257 pNode->fDisconnect = true ;
271258 pCurrentMemberHash = nullptr ;
272259 return ;
273- } else {
260+ case DataRequestStatus::Pending:
274261 printLog (" Waiting" );
275262 return ;
276263 }
@@ -377,7 +364,7 @@ void QuorumObserver::StartCleanupOldQuorumDataThread(gsl::not_null<const CBlockI
377364 }
378365
379366 if (!quorumThreadInterrupt) {
380- WITH_LOCK ( m_qman.cs_db , DataCleanupHelper (*m_qman. db , dbKeysToSkip) );
367+ m_qman.CleanupOldQuorumData ( dbKeysToSkip);
381368 }
382369
383370 LogPrint (BCLog::LLMQ, " QuorumObserver::StartCleanupOldQuorumDataThread -- done. time=%d\n " , t.count ());
0 commit comments