diff --git a/src/llmq/quorums.cpp b/src/llmq/quorums.cpp index dedf7a4263dd..88ff9cc0a487 100644 --- a/src/llmq/quorums.cpp +++ b/src/llmq/quorums.cpp @@ -283,7 +283,7 @@ void CQuorumManager::UpdatedBlockTip(const CBlockIndex* pindexNew, bool fInitial LOCK(cs_data_requests); auto it = mapQuorumDataRequests.begin(); while (it != mapQuorumDataRequests.end()) { - if (it->second.IsExpired()) { + if (it->second.IsExpired(/*add_bias=*/true)) { it = mapQuorumDataRequests.erase(it); } else { ++it; @@ -474,7 +474,7 @@ bool CQuorumManager::RequestQuorumData(CNode* pfrom, Consensus::LLMQType llmqTyp key.quorumHash = pQuorumBaseBlockIndex->GetBlockHash(); key.llmqType = llmqType; auto it = mapQuorumDataRequests.emplace(key, CQuorumDataRequest(llmqType, pQuorumBaseBlockIndex->GetBlockHash(), nDataMask, proTxHash)); - if (!it.second && !it.first->second.IsExpired()) { + if (!it.second && !it.first->second.IsExpired(/*add_bias=*/true)) { LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- Already requested\n", __func__); return false; } @@ -646,7 +646,7 @@ void CQuorumManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, C auto it = mapQuorumDataRequests.find(key); if (it == mapQuorumDataRequests.end()) { it = mapQuorumDataRequests.emplace(key, request).first; - } else if (it->second.IsExpired()) { + } else if (it->second.IsExpired(/*add_bias=*/false)) { it->second = request; } else { errorHandler("Request limit exceeded", 25); @@ -901,7 +901,7 @@ void CQuorumManager::StartQuorumDataRecoveryThread(const CQuorumCPtr pQuorum, co key.quorumHash = pQuorum->qc->quorumHash; key.llmqType = pQuorum->qc->llmqType; auto it = mapQuorumDataRequests.find(key); - if (it != mapQuorumDataRequests.end() && !it->second.IsExpired()) { + if (it != mapQuorumDataRequests.end() && !it->second.IsExpired(/*add_bias=*/true)) { printLog("Already asked"); continue; } diff --git a/src/llmq/quorums.h b/src/llmq/quorums.h index 5e6d12dd8c06..6e24d369d1fd 100644 --- a/src/llmq/quorums.h +++ b/src/llmq/quorums.h @@ -83,6 +83,7 @@ class CQuorumDataRequest bool fProcessed{false}; static constexpr int64_t EXPIRATION_TIMEOUT{300}; + static constexpr int64_t EXPIRATION_BIAS{60}; public: @@ -119,7 +120,7 @@ class CQuorumDataRequest Errors GetError() const { return nError; } std::string GetErrorString() const; - bool IsExpired() const { return (GetTime() - nTime) >= EXPIRATION_TIMEOUT; } + bool IsExpired(bool add_bias) const { return (GetTime() - nTime) >= (EXPIRATION_TIMEOUT + (add_bias ? EXPIRATION_BIAS : 0)); } bool IsProcessed() const { return fProcessed; } void SetProcessed() { fProcessed = true; }