@@ -164,7 +164,7 @@ int CQuorum::GetMemberIndex(const uint256& proTxHash) const
164
164
return -1 ;
165
165
}
166
166
167
- void CQuorum::WriteContributions (CEvoDB& evoDb ) const
167
+ void CQuorum::WriteContributions (CDBWrapper& db ) const
168
168
{
169
169
uint256 dbKey = MakeQuorumKey (*this );
170
170
@@ -175,19 +175,19 @@ void CQuorum::WriteContributions(CEvoDB& evoDb) const
175
175
for (auto & pubkey : *quorumVvec) {
176
176
s << CBLSPublicKeyVersionWrapper (pubkey, false );
177
177
}
178
- evoDb. GetRawDB () .Write (std::make_pair (DB_QUORUM_QUORUM_VVEC, dbKey), s);
178
+ db .Write (std::make_pair (DB_QUORUM_QUORUM_VVEC, dbKey), s);
179
179
}
180
180
if (skShare.IsValid ()) {
181
- evoDb. GetRawDB () .Write (std::make_pair (DB_QUORUM_SK_SHARE, dbKey), skShare);
181
+ db .Write (std::make_pair (DB_QUORUM_SK_SHARE, dbKey), skShare);
182
182
}
183
183
}
184
184
185
- bool CQuorum::ReadContributions (CEvoDB& evoDb )
185
+ bool CQuorum::ReadContributions (const CDBWrapper& db )
186
186
{
187
187
uint256 dbKey = MakeQuorumKey (*this );
188
188
CDataStream s (SER_DISK, CLIENT_VERSION);
189
189
190
- if (!evoDb. GetRawDB () .ReadDataStream (std::make_pair (DB_QUORUM_QUORUM_VVEC, dbKey), s)) {
190
+ if (!db .ReadDataStream (std::make_pair (DB_QUORUM_QUORUM_VVEC, dbKey), s)) {
191
191
return false ;
192
192
}
193
193
@@ -203,27 +203,31 @@ bool CQuorum::ReadContributions(CEvoDB& evoDb)
203
203
quorumVvec = std::make_shared<std::vector<CBLSPublicKey>>(std::move (qv));
204
204
// We ignore the return value here as it is ok if this fails. If it fails, it usually means that we are not a
205
205
// member of the quorum but observed the whole DKG process to have the quorum verification vector.
206
- evoDb. GetRawDB () .Read (std::make_pair (DB_QUORUM_SK_SHARE, dbKey), skShare);
206
+ db .Read (std::make_pair (DB_QUORUM_SK_SHARE, dbKey), skShare);
207
207
208
208
return true ;
209
209
}
210
210
211
- CQuorumManager::CQuorumManager (CBLSWorker& _blsWorker, CChainState& chainstate, CConnman& _connman, CDeterministicMNManager& dmnman,
212
- CDKGSessionManager& _dkgManager, CEvoDB& _evoDb, CQuorumBlockProcessor& _quorumBlockProcessor,
213
- const CActiveMasternodeManager* const mn_activeman, const CMasternodeSync& mn_sync, const CSporkManager& sporkman) :
211
+ CQuorumManager::CQuorumManager (CBLSWorker& _blsWorker, CChainState& chainstate, CConnman& _connman,
212
+ CDeterministicMNManager& dmnman, CDKGSessionManager& _dkgManager, CEvoDB& _evoDb,
213
+ CQuorumBlockProcessor& _quorumBlockProcessor,
214
+ const CActiveMasternodeManager* const mn_activeman, const CMasternodeSync& mn_sync,
215
+ const CSporkManager& sporkman, bool unit_tests, bool wipe) :
216
+ db (std::make_unique<CDBWrapper>(unit_tests ? " " : (gArgs .GetDataDirNet() / " llmq" / " quorumdb" ), 1 << 20 ,
217
+ unit_tests, wipe)),
214
218
blsWorker (_blsWorker),
215
219
m_chainstate (chainstate),
216
220
connman (_connman),
217
221
m_dmnman (dmnman),
218
222
dkgManager (_dkgManager),
219
- m_evoDb (_evoDb),
220
223
quorumBlockProcessor (_quorumBlockProcessor),
221
224
m_mn_activeman (mn_activeman),
222
225
m_mn_sync (mn_sync),
223
226
m_sporkman (sporkman)
224
227
{
225
228
utils::InitQuorumsCache (mapQuorumsCache, false );
226
229
quorumThreadInterrupt.reset ();
230
+ MigrateOldQuorumDB (_evoDb);
227
231
}
228
232
229
233
void CQuorumManager::Start ()
@@ -404,11 +408,11 @@ CQuorumPtr CQuorumManager::BuildQuorumFromCommitment(const Consensus::LLMQType l
404
408
quorum->Init (std::move (qc), pQuorumBaseBlockIndex, minedBlockHash, members);
405
409
406
410
bool hasValidVvec = false ;
407
- if (quorum->ReadContributions (m_evoDb )) {
411
+ if (WITH_LOCK (cs_db, return quorum->ReadContributions (*db) )) {
408
412
hasValidVvec = true ;
409
413
} else {
410
414
if (BuildQuorumContributions (quorum->qc , quorum)) {
411
- quorum->WriteContributions (m_evoDb );
415
+ WITH_LOCK (cs_db, quorum->WriteContributions (*db) );
412
416
hasValidVvec = true ;
413
417
} else {
414
418
LogPrint (BCLog::LLMQ, " CQuorumManager::%s -- llmqType[%d] quorumIndex[%d] quorum.ReadContributions and BuildQuorumContributions for quorumHash[%s] failed\n " , __func__, ToUnderlying (llmqType), quorum->qc ->quorumIndex , quorum->qc ->quorumHash .ToString ());
@@ -846,7 +850,7 @@ PeerMsgRet CQuorumManager::ProcessMessage(CNode& pfrom, const std::string& msg_t
846
850
return errorHandler (" Invalid secret key share received" );
847
851
}
848
852
}
849
- pQuorum->WriteContributions (m_evoDb );
853
+ WITH_LOCK (cs_db, pQuorum->WriteContributions (*db) );
850
854
return {};
851
855
}
852
856
return {};
@@ -1100,13 +1104,76 @@ void CQuorumManager::StartCleanupOldQuorumDataThread(const CBlockIndex* pIndex)
1100
1104
}
1101
1105
1102
1106
if (!quorumThreadInterrupt) {
1103
- DataCleanupHelper (m_evoDb. GetRawDB () , dbKeysToSkip);
1107
+ WITH_LOCK (cs_db, DataCleanupHelper (*db , dbKeysToSkip) );
1104
1108
}
1105
1109
1106
1110
LogPrint (BCLog::LLMQ, " CQuorumManager::StartCleanupOldQuorumDataThread -- done. time=%d\n " , t.count ());
1107
1111
});
1108
1112
}
1109
1113
1114
+ // TODO: remove in v23
1115
+ void CQuorumManager::MigrateOldQuorumDB (CEvoDB& evoDb) const
1116
+ {
1117
+ LOCK (cs_db);
1118
+ if (!db->IsEmpty ()) return ;
1119
+
1120
+ const auto prefixes = {DB_QUORUM_QUORUM_VVEC, DB_QUORUM_SK_SHARE};
1121
+
1122
+ LogPrint (BCLog::LLMQ, " CQuorumManager::%s -- start\n " , __func__);
1123
+
1124
+ CDBBatch batch (*db);
1125
+ std::unique_ptr<CDBIterator> pcursor (evoDb.GetRawDB ().NewIterator ());
1126
+
1127
+ for (const auto & prefix : prefixes) {
1128
+ auto start = std::make_tuple (prefix, uint256 ());
1129
+ pcursor->Seek (start);
1130
+
1131
+ int count{0 };
1132
+ while (pcursor->Valid ()) {
1133
+ decltype (start) k;
1134
+ CDataStream s (SER_DISK, CLIENT_VERSION);
1135
+ CBLSSecretKey sk;
1136
+
1137
+ if (!pcursor->GetKey (k) || std::get<0 >(k) != prefix) {
1138
+ break ;
1139
+ }
1140
+
1141
+ if (prefix == DB_QUORUM_QUORUM_VVEC) {
1142
+ if (!evoDb.GetRawDB ().ReadDataStream (k, s)) {
1143
+ break ;
1144
+ }
1145
+ batch.Write (k, s);
1146
+ }
1147
+ if (prefix == DB_QUORUM_SK_SHARE) {
1148
+ if (!pcursor->GetValue (sk)) {
1149
+ break ;
1150
+ }
1151
+ batch.Write (k, sk);
1152
+ }
1153
+
1154
+ if (batch.SizeEstimate () >= (1 << 24 )) {
1155
+ db->WriteBatch (batch);
1156
+ batch.Clear ();
1157
+ }
1158
+
1159
+ ++count;
1160
+ pcursor->Next ();
1161
+ }
1162
+
1163
+ db->WriteBatch (batch);
1164
+
1165
+ LogPrint (BCLog::LLMQ, " CQuorumManager::%s -- %s moved %d\n " , __func__, prefix, count);
1166
+ }
1167
+
1168
+ pcursor.reset ();
1169
+ db->CompactFull ();
1170
+
1171
+ DataCleanupHelper (evoDb.GetRawDB (), {});
1172
+ evoDb.CommitRootTransaction ();
1173
+
1174
+ LogPrint (BCLog::LLMQ, " CQuorumManager::%s -- done\n " , __func__);
1175
+ }
1176
+
1110
1177
CQuorumCPtr SelectQuorumForSigning (const Consensus::LLMQParams& llmq_params, const CChain& active_chain, const CQuorumManager& qman,
1111
1178
const uint256& selectionHash, int signHeight, int signOffset)
1112
1179
{
0 commit comments