@@ -454,14 +454,14 @@ void CSigSharesManager::CollectPendingSigSharesToVerify(
454
454
}
455
455
}
456
456
457
- void CSigSharesManager::ProcessPendingSigShares (CConnman& connman)
457
+ bool CSigSharesManager::ProcessPendingSigShares (CConnman& connman)
458
458
{
459
459
std::map<NodeId, std::vector<CSigShare>> sigSharesByNodes;
460
460
std::map<std::pair<Consensus::LLMQType, uint256>, CQuorumCPtr> quorums;
461
461
462
462
CollectPendingSigSharesToVerify (32 , sigSharesByNodes, quorums);
463
463
if (sigSharesByNodes.empty ()) {
464
- return ;
464
+ return false ;
465
465
}
466
466
467
467
// It's ok to perform insecure batched verification here as we verify against the quorum public key shares,
@@ -521,6 +521,8 @@ void CSigSharesManager::ProcessPendingSigShares(CConnman& connman)
521
521
522
522
ProcessPendingSigSharesFromNode (nodeId, v, quorums, connman);
523
523
}
524
+
525
+ return true ;
524
526
}
525
527
526
528
// It's ensured that no duplicates are passed to this method
@@ -881,7 +883,7 @@ void CSigSharesManager::CollectSigSharesToAnnounce(std::map<NodeId, std::map<uin
881
883
this ->sigSharesToAnnounce .clear ();
882
884
}
883
885
884
- void CSigSharesManager::SendMessages ()
886
+ bool CSigSharesManager::SendMessages ()
885
887
{
886
888
std::multimap<CService, NodeId> nodesByAddress;
887
889
g_connman->ForEachNode ([&nodesByAddress](CNode* pnode) {
@@ -943,6 +945,8 @@ void CSigSharesManager::SendMessages()
943
945
if (didSend) {
944
946
g_connman->WakeSelect ();
945
947
}
948
+
949
+ return didSend;
946
950
}
947
951
948
952
void CSigSharesManager::Cleanup ()
@@ -1110,6 +1114,8 @@ void CSigSharesManager::WorkThreadMain()
1110
1114
{
1111
1115
workInterrupt.reset ();
1112
1116
1117
+ int64_t lastSendTime = 0 ;
1118
+
1113
1119
while (!workInterrupt) {
1114
1120
if (!quorumSigningManager || !g_connman || !quorumSigningManager) {
1115
1121
if (!workInterrupt.sleep_for (std::chrono::milliseconds (100 ))) {
@@ -1118,17 +1124,26 @@ void CSigSharesManager::WorkThreadMain()
1118
1124
continue ;
1119
1125
}
1120
1126
1127
+ bool didWork = false ;
1128
+
1121
1129
RemoveBannedNodeStates ();
1122
- quorumSigningManager->ProcessPendingRecoveredSigs (*g_connman);
1123
- ProcessPendingSigShares (*g_connman);
1124
- SignPendingSigShares ();
1125
- SendMessages ();
1130
+ didWork |= quorumSigningManager->ProcessPendingRecoveredSigs (*g_connman);
1131
+ didWork |= ProcessPendingSigShares (*g_connman);
1132
+ didWork |= SignPendingSigShares ();
1133
+
1134
+ if (GetTimeMillis () - lastSendTime > 100 ) {
1135
+ SendMessages ();
1136
+ lastSendTime = GetTimeMillis ();
1137
+ }
1138
+
1126
1139
Cleanup ();
1127
1140
quorumSigningManager->Cleanup ();
1128
1141
1129
1142
// TODO Wakeup when pending signing is needed?
1130
- if (!workInterrupt.sleep_for (std::chrono::milliseconds (100 ))) {
1131
- return ;
1143
+ if (!didWork) {
1144
+ if (!workInterrupt.sleep_for (std::chrono::milliseconds (100 ))) {
1145
+ return ;
1146
+ }
1132
1147
}
1133
1148
}
1134
1149
}
@@ -1139,7 +1154,7 @@ void CSigSharesManager::AsyncSign(const CQuorumCPtr& quorum, const uint256& id,
1139
1154
pendingSigns.emplace_back (quorum, id, msgHash);
1140
1155
}
1141
1156
1142
- void CSigSharesManager::SignPendingSigShares ()
1157
+ bool CSigSharesManager::SignPendingSigShares ()
1143
1158
{
1144
1159
std::vector<std::tuple<const CQuorumCPtr, uint256, uint256>> v;
1145
1160
{
@@ -1150,6 +1165,8 @@ void CSigSharesManager::SignPendingSigShares()
1150
1165
for (auto & t : v) {
1151
1166
Sign (std::get<0 >(t), std::get<1 >(t), std::get<2 >(t));
1152
1167
}
1168
+
1169
+ return !v.empty ();
1153
1170
}
1154
1171
1155
1172
void CSigSharesManager::Sign (const CQuorumCPtr& quorum, const uint256& id, const uint256& msgHash)
0 commit comments