1515#include < unordered_lru_cache.h>
1616
1717#include < sync.h>
18- #include < util/threadinterrupt.h>
1918
2019#include < gsl/pointers.h>
2120
22- #include < deque >
21+ #include < atomic >
2322#include < map>
2423#include < memory>
25- #include < thread>
2624
2725class CBLSSignature ;
2826class CBLSWorker ;
@@ -96,10 +94,7 @@ class CQuorumManager final
9694 mutable Uint256LruHashMap<const CBlockIndex*, /* max_size=*/ 128 > quorumBaseBlockIndexCache
9795 GUARDED_BY (cs_quorumBaseBlockIndexCache);
9896
99- mutable Mutex m_cache_cs;
100- mutable std::deque<CQuorumCPtr> m_cache_queue GUARDED_BY (m_cache_cs);
101- mutable CThreadInterrupt m_cache_interrupt;
102- mutable std::thread m_cache_thread;
97+ std::atomic<bool > m_warming_interrupted{false };
10398
10499public:
105100 CQuorumManager () = delete ;
@@ -135,20 +130,20 @@ class CQuorumManager final
135130
136131 // all these methods will lock cs_main for a short period of time
137132 CQuorumCPtr GetQuorum (Consensus::LLMQType llmqType, const uint256& quorumHash) const
138- EXCLUSIVE_LOCKS_REQUIRED(!cs_db, !m_cs_maps, !m_cache_cs );
133+ EXCLUSIVE_LOCKS_REQUIRED(!cs_db, !m_cs_maps);
139134 CQuorumCPtr GetQuorum (Consensus::LLMQType llmqType, const uint256& quorumHash, const CChain& chain) const
140- EXCLUSIVE_LOCKS_REQUIRED(::cs_main, !cs_db, !m_cs_maps, !m_cache_cs );
135+ EXCLUSIVE_LOCKS_REQUIRED(::cs_main, !cs_db, !m_cs_maps);
141136 std::vector<CQuorumCPtr> ScanQuorums (Consensus::LLMQType llmqType, size_t nCountRequested) const
142- EXCLUSIVE_LOCKS_REQUIRED(!cs_db, !m_cs_maps, !m_cache_cs );
137+ EXCLUSIVE_LOCKS_REQUIRED(!cs_db, !m_cs_maps);
143138
144139 // this one is cs_main-free
145140 std::vector<CQuorumCPtr> ScanQuorums (Consensus::LLMQType llmqType, gsl::not_null<const CBlockIndex*> pindexStart,
146141 size_t nCountRequested) const
147- EXCLUSIVE_LOCKS_REQUIRED(!cs_db, !m_cs_maps, !m_cache_cs );
142+ EXCLUSIVE_LOCKS_REQUIRED(!cs_db, !m_cs_maps);
148143 std::vector<CQuorumCPtr> ScanQuorums (Consensus::LLMQType llmqType,
149144 gsl::not_null<const CBlockIndex*> pindexStart,
150145 size_t nCountRequested, const CChain& chain) const
151- EXCLUSIVE_LOCKS_REQUIRED(::cs_main, !cs_db, !m_cs_maps, !m_cache_cs );
146+ EXCLUSIVE_LOCKS_REQUIRED(::cs_main, !cs_db, !m_cs_maps);
152147
153148 bool IsMasternode () const ;
154149 bool IsWatching () const ;
@@ -175,29 +170,30 @@ class CQuorumManager final
175170 CQuorumPtr GetCachedMutableQuorum (Consensus::LLMQType llmqType, const uint256& quorumHash) const
176171 EXCLUSIVE_LOCKS_REQUIRED(!m_cs_maps);
177172 void WriteContributions (const CQuorumPtr& quorum) const EXCLUSIVE_LOCKS_REQUIRED(!cs_db);
178- void QueueQuorumForWarming (CQuorumCPtr pQuorum) const EXCLUSIVE_LOCKS_REQUIRED(!m_cache_cs);
173+ void QueueQuorumForWarming (CQuorumCPtr pQuorum) const ;
174+ /* * Make queued and running warming jobs return; call before stopping the BLS worker pool */
175+ void InterruptWarming () { m_warming_interrupted = true ; }
179176
180177private:
181178 // all private methods here are cs_main-free
182179 std::vector<CQuorumCPtr> ScanQuorums (Consensus::LLMQType llmqType,
183180 gsl::not_null<const CBlockIndex*> pindexStart,
184181 size_t nCountRequested, const CChain* chain) const
185- EXCLUSIVE_LOCKS_REQUIRED(!cs_db, !m_cs_maps, !m_cache_cs );
182+ EXCLUSIVE_LOCKS_REQUIRED(!cs_db, !m_cs_maps);
186183 bool BuildQuorumContributions (const CFinalCommitmentPtr& fqc, const std::shared_ptr<CQuorum>& quorum) const ;
187184
188185 CQuorumPtr BuildQuorumFromCommitment (Consensus::LLMQType llmqType,
189186 gsl::not_null<const CBlockIndex*> pQuorumBaseBlockIndex,
190187 bool populate_cache) const
191- EXCLUSIVE_LOCKS_REQUIRED(!cs_db, !m_cs_maps, !m_cache_cs );
188+ EXCLUSIVE_LOCKS_REQUIRED(!cs_db, !m_cs_maps);
192189
193190 CQuorumCPtr GetQuorum (Consensus::LLMQType llmqType, gsl::not_null<const CBlockIndex*> pindex,
194191 bool populate_cache = true ) const
195- EXCLUSIVE_LOCKS_REQUIRED(!cs_db, !m_cs_maps, !m_cache_cs );
192+ EXCLUSIVE_LOCKS_REQUIRED(!cs_db, !m_cs_maps);
196193 CQuorumCPtr GetQuorum (Consensus::LLMQType llmqType, gsl::not_null<const CBlockIndex*> pindex,
197194 const CChain& chain, bool populate_cache = true ) const
198- EXCLUSIVE_LOCKS_REQUIRED(::cs_main, !cs_db, !m_cs_maps, !m_cache_cs );
195+ EXCLUSIVE_LOCKS_REQUIRED(::cs_main, !cs_db, !m_cs_maps);
199196
200- void CacheWarmingThreadMain () const EXCLUSIVE_LOCKS_REQUIRED(!m_cache_cs);
201197 void MigrateOldQuorumDB (CEvoDB& evoDb) const EXCLUSIVE_LOCKS_REQUIRED(!cs_db);
202198};
203199
0 commit comments