From ff0f0030721ff64f4f4a89bcbf29c40b85d838fd Mon Sep 17 00:00:00 2001 From: Odysseas Gabrielides Date: Sun, 2 Apr 2023 23:15:38 +0300 Subject: [PATCH 1/3] mark request as processed only when successful --- src/llmq/quorums.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/llmq/quorums.cpp b/src/llmq/quorums.cpp index 522e60d0a1d9..af63d801c033 100644 --- a/src/llmq/quorums.cpp +++ b/src/llmq/quorums.cpp @@ -731,6 +731,7 @@ void CQuorumManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, C CQuorumDataRequest request; vRecv >> request; + decltype(mapQuorumDataRequests)::iterator it_request; { LOCK2(cs_main, cs_data_requests); CQuorumDataRequestKey key; @@ -738,20 +739,19 @@ void CQuorumManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, C key.flag = true; key.quorumHash = request.GetQuorumHash(); key.llmqType = request.GetLLMQType(); - auto it = mapQuorumDataRequests.find(key); - if (it == mapQuorumDataRequests.end()) { + it_request = mapQuorumDataRequests.find(key); + if (it_request == mapQuorumDataRequests.end()) { errorHandler("Not requested"); return; } - if (it->second.IsProcessed()) { + if (it_request->second.IsProcessed()) { errorHandler("Already received"); return; } - if (request != it->second) { + if (request != it_request->second) { errorHandler("Not like requested"); return; } - it->second.SetProcessed(); } if (request.GetError() != CQuorumDataRequest::Errors::NONE) { @@ -816,6 +816,8 @@ void CQuorumManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, C } } pQuorum->WriteContributions(m_evoDb); + it_request->second.SetProcessed(); + return; } } From 8d49fb63a0c194db76d051161e4403be00669434 Mon Sep 17 00:00:00 2001 From: Odysseas Gabrielides Date: Mon, 3 Apr 2023 10:12:12 +0300 Subject: [PATCH 2/3] linter fix --- src/llmq/quorums.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llmq/quorums.cpp b/src/llmq/quorums.cpp index af63d801c033..4a7313c266ff 100644 --- a/src/llmq/quorums.cpp +++ b/src/llmq/quorums.cpp @@ -817,7 +817,7 @@ void CQuorumManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, C } pQuorum->WriteContributions(m_evoDb); it_request->second.SetProcessed(); - + return; } } From 8a90d8fdb1f3bf4ace74f712b4cbfb51ce198fe2 Mon Sep 17 00:00:00 2001 From: Odysseas Gabrielides Date: Mon, 3 Apr 2023 18:11:51 +0300 Subject: [PATCH 3/3] re-search with key --- src/llmq/quorums.cpp | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/llmq/quorums.cpp b/src/llmq/quorums.cpp index 4a7313c266ff..fb9cd1fa67c5 100644 --- a/src/llmq/quorums.cpp +++ b/src/llmq/quorums.cpp @@ -731,24 +731,23 @@ void CQuorumManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, C CQuorumDataRequest request; vRecv >> request; - decltype(mapQuorumDataRequests)::iterator it_request; + CQuorumDataRequestKey key; + key.proRegTx = pfrom.GetVerifiedProRegTxHash(); + key.flag = true; + key.quorumHash = request.GetQuorumHash(); + key.llmqType = request.GetLLMQType(); { LOCK2(cs_main, cs_data_requests); - CQuorumDataRequestKey key; - key.proRegTx = pfrom.GetVerifiedProRegTxHash(); - key.flag = true; - key.quorumHash = request.GetQuorumHash(); - key.llmqType = request.GetLLMQType(); - it_request = mapQuorumDataRequests.find(key); - if (it_request == mapQuorumDataRequests.end()) { + auto it = mapQuorumDataRequests.find(key); + if (it == mapQuorumDataRequests.end()) { errorHandler("Not requested"); return; } - if (it_request->second.IsProcessed()) { + if (it->second.IsProcessed()) { errorHandler("Already received"); return; } - if (request != it_request->second) { + if (request != it->second) { errorHandler("Not like requested"); return; } @@ -816,7 +815,13 @@ void CQuorumManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, C } } pQuorum->WriteContributions(m_evoDb); - it_request->second.SetProcessed(); + { + LOCK2(cs_main, cs_data_requests); + auto it = mapQuorumDataRequests.find(key); + if (it != mapQuorumDataRequests.end()) { + it->second.SetProcessed(); + } + } return; }