Skip to content

Commit ae78360

Browse files
codablockUdjinM6
authored andcommitted
Add cache to CQuorumManager::ScanQuorums (#2856)
1 parent 241f76f commit ae78360

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

src/llmq/quorums.cpp

+30-1
Original file line numberDiff line numberDiff line change
@@ -311,9 +311,29 @@ std::vector<CQuorumCPtr> CQuorumManager::ScanQuorums(Consensus::LLMQType llmqTyp
311311
{
312312
auto& params = Params().GetConsensus().llmqs.at(llmqType);
313313

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
315316

316317
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);
317337
result.reserve(quorumIndexes.size());
318338

319339
for (auto& quorumIndex : quorumIndexes) {
@@ -323,6 +343,15 @@ std::vector<CQuorumCPtr> CQuorumManager::ScanQuorums(Consensus::LLMQType llmqTyp
323343
result.emplace_back(quorum);
324344
}
325345

346+
if (storeCache) {
347+
LOCK(quorumsCacheCs);
348+
scanQuorumsCache.insert(cacheKey, result);
349+
}
350+
351+
if (result.size() > maxCount) {
352+
result.resize(maxCount);
353+
}
354+
326355
return result;
327356
}
328357

src/llmq/quorums.h

+3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
#include "validationinterface.h"
1313
#include "consensus/params.h"
14+
#include "saltedhasher.h"
15+
#include "unordered_lru_cache.h"
1416

1517
#include "bls/bls.h"
1618
#include "bls/bls_worker.h"
@@ -85,6 +87,7 @@ class CQuorumManager
8587

8688
CCriticalSection quorumsCacheCs;
8789
std::map<std::pair<Consensus::LLMQType, uint256>, CQuorumPtr> quorumsCache;
90+
unordered_lru_cache<std::pair<Consensus::LLMQType, uint256>, std::vector<CQuorumCPtr>, StaticSaltedHasher, 32> scanQuorumsCache;
8891

8992
public:
9093
CQuorumManager(CEvoDB& _evoDb, CBLSWorker& _blsWorker, CDKGSessionManager& _dkgManager);

0 commit comments

Comments
 (0)