On timeout, print members proTxHashes from members which did not send a share (#2731)
* On timeout, print members proTxHashes from members which did not send a share * Move inactive quorums check above timeout checks This allows to reuse things in the next commit * Avoid locking cs_main through GetQuorum by using a pre-filled map * Use find() instead of [] to access quorums map
This commit is contained in:
parent
ea90296b6d
commit
2041186f4d
@ -1176,7 +1176,42 @@ void CSigSharesManager::Cleanup()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unordered_set<std::pair<Consensus::LLMQType, uint256>, StaticSaltedHasher> quorumsToCheck;
|
// This map is first filled with all quorums found in all sig shares. Then we remove all inactive quorums and
|
||||||
|
// loop through all sig shares again to find the ones belonging to the inactive quorums. We then delete the
|
||||||
|
// sessions belonging to the sig shares. At the same time, we use this map as a cache when we later need to resolve
|
||||||
|
// quorumHash -> quorumPtr (as GetQuorum() requires cs_main, leading to deadlocks with cs held)
|
||||||
|
std::unordered_map<std::pair<Consensus::LLMQType, uint256>, CQuorumCPtr, StaticSaltedHasher> quorums;
|
||||||
|
|
||||||
|
{
|
||||||
|
LOCK(cs);
|
||||||
|
sigShares.ForEach([&](const SigShareKey& k, const CSigShare& sigShare) {
|
||||||
|
quorums.emplace(std::make_pair((Consensus::LLMQType) sigShare.llmqType, sigShare.quorumHash), nullptr);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find quorums which became inactive
|
||||||
|
for (auto it = quorums.begin(); it != quorums.end(); ) {
|
||||||
|
if (CLLMQUtils::IsQuorumActive(it->first.first, it->first.second)) {
|
||||||
|
it->second = quorumManager->GetQuorum(it->first.first, it->first.second);
|
||||||
|
++it;
|
||||||
|
} else {
|
||||||
|
it = quorums.erase(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// Now delete sessions which are for inactive quorums
|
||||||
|
LOCK(cs);
|
||||||
|
std::unordered_set<uint256, StaticSaltedHasher> inactiveQuorumSessions;
|
||||||
|
sigShares.ForEach([&](const SigShareKey& k, const CSigShare& sigShare) {
|
||||||
|
if (!quorums.count(std::make_pair((Consensus::LLMQType)sigShare.llmqType, sigShare.quorumHash))) {
|
||||||
|
inactiveQuorumSessions.emplace(sigShare.GetSignHash());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
for (auto& signHash : inactiveQuorumSessions) {
|
||||||
|
RemoveSigSharesForSession(signHash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
LOCK(cs);
|
LOCK(cs);
|
||||||
@ -1214,41 +1249,29 @@ void CSigSharesManager::Cleanup()
|
|||||||
assert(m);
|
assert(m);
|
||||||
|
|
||||||
auto& oneSigShare = m->begin()->second;
|
auto& oneSigShare = m->begin()->second;
|
||||||
LogPrintf("CSigSharesManager::%s -- signing session timed out. signHash=%s, id=%s, msgHash=%s, sigShareCount=%d\n", __func__,
|
|
||||||
signHash.ToString(), oneSigShare.id.ToString(), oneSigShare.msgHash.ToString(), count);
|
std::string strMissingMembers;
|
||||||
|
if (LogAcceptCategory("llmq")) {
|
||||||
|
auto quorumIt = quorums.find(std::make_pair((Consensus::LLMQType)oneSigShare.llmqType, oneSigShare.quorumHash));
|
||||||
|
if (quorumIt != quorums.end()) {
|
||||||
|
auto& quorum = quorumIt->second;
|
||||||
|
for (size_t i = 0; i < quorum->members.size(); i++) {
|
||||||
|
if (!m->count((uint16_t)i)) {
|
||||||
|
auto& dmn = quorum->members[i];
|
||||||
|
strMissingMembers += strprintf("\n %s", dmn->proTxHash.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LogPrintf("CSigSharesManager::%s -- signing session timed out. signHash=%s, id=%s, msgHash=%s, sigShareCount=%d, missingMembers=%s\n", __func__,
|
||||||
|
signHash.ToString(), oneSigShare.id.ToString(), oneSigShare.msgHash.ToString(), count, strMissingMembers);
|
||||||
} else {
|
} else {
|
||||||
LogPrintf("CSigSharesManager::%s -- signing session timed out. signHash=%s, sigShareCount=%d\n", __func__,
|
LogPrintf("CSigSharesManager::%s -- signing session timed out. signHash=%s, sigShareCount=%d\n", __func__,
|
||||||
signHash.ToString(), count);
|
signHash.ToString(), count);
|
||||||
}
|
}
|
||||||
RemoveSigSharesForSession(signHash);
|
RemoveSigSharesForSession(signHash);
|
||||||
}
|
}
|
||||||
|
|
||||||
sigShares.ForEach([&](const SigShareKey& k, const CSigShare& sigShare) {
|
|
||||||
quorumsToCheck.emplace((Consensus::LLMQType) sigShare.llmqType, sigShare.quorumHash);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find quorums which became inactive
|
|
||||||
for (auto it = quorumsToCheck.begin(); it != quorumsToCheck.end(); ) {
|
|
||||||
if (CLLMQUtils::IsQuorumActive(it->first, it->second)) {
|
|
||||||
it = quorumsToCheck.erase(it);
|
|
||||||
} else {
|
|
||||||
++it;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
// Now delete sessions which are for inactive quorums
|
|
||||||
LOCK(cs);
|
|
||||||
std::unordered_set<uint256, StaticSaltedHasher> inactiveQuorumSessions;
|
|
||||||
sigShares.ForEach([&](const SigShareKey& k, const CSigShare& sigShare) {
|
|
||||||
if (quorumsToCheck.count(std::make_pair((Consensus::LLMQType)sigShare.llmqType, sigShare.quorumHash))) {
|
|
||||||
inactiveQuorumSessions.emplace(sigShare.GetSignHash());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
for (auto& signHash : inactiveQuorumSessions) {
|
|
||||||
RemoveSigSharesForSession(signHash);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find node states for peers that disappeared from CConnman
|
// Find node states for peers that disappeared from CConnman
|
||||||
|
Loading…
Reference in New Issue
Block a user