@@ -311,9 +311,29 @@ std::vector<CQuorumCPtr> CQuorumManager::ScanQuorums(Consensus::LLMQType llmqTyp
311
311
{
312
312
auto & params = Params ().GetConsensus ().llmqs .at (llmqType);
313
313
314
- auto quorumIndexes = quorumBlockProcessor->GetMinedCommitmentsUntilBlock (params.type , pindexStart, maxCount);
314
+ auto cacheKey = std::make_pair (llmqType, pindexStart->GetBlockHash ());
315
+ const size_t cacheMaxSize = 25 ; // largest active set + 1
315
316
316
317
std::vector<CQuorumCPtr> result;
318
+
319
+ if (maxCount <= cacheMaxSize) {
320
+ LOCK (quorumsCacheCs);
321
+ if (scanQuorumsCache.get (cacheKey, result)) {
322
+ if (result.size () > maxCount) {
323
+ result.resize (maxCount);
324
+ }
325
+ return result;
326
+ }
327
+ }
328
+
329
+ bool storeCache = false ;
330
+ size_t maxCount2 = maxCount;
331
+ if (maxCount2 <= cacheMaxSize) {
332
+ maxCount2 = cacheMaxSize;
333
+ storeCache = true ;
334
+ }
335
+
336
+ auto quorumIndexes = quorumBlockProcessor->GetMinedCommitmentsUntilBlock (params.type , pindexStart, maxCount2);
317
337
result.reserve (quorumIndexes.size ());
318
338
319
339
for (auto & quorumIndex : quorumIndexes) {
@@ -323,6 +343,15 @@ std::vector<CQuorumCPtr> CQuorumManager::ScanQuorums(Consensus::LLMQType llmqTyp
323
343
result.emplace_back (quorum);
324
344
}
325
345
346
+ if (storeCache) {
347
+ LOCK (quorumsCacheCs);
348
+ scanQuorumsCache.insert (cacheKey, result);
349
+ }
350
+
351
+ if (result.size () > maxCount) {
352
+ result.resize (maxCount);
353
+ }
354
+
326
355
return result;
327
356
}
328
357
0 commit comments