Have WalletBatch automatically flush every 1000 updates
Since it now automatically flushes, we don't need to have UpgradeKeyMetadata count and flush separately
This commit is contained in:
parent
366fe0be0b
commit
d6576e349e
3 changed files with 14 additions and 9 deletions
|
@ -614,7 +614,9 @@ void BerkeleyBatch::Flush()
|
||||||
if (fReadOnly)
|
if (fReadOnly)
|
||||||
nMinutes = 1;
|
nMinutes = 1;
|
||||||
|
|
||||||
|
if (env) { // env is nullptr for dummy databases (i.e. in tests). Don't actually flush if env is nullptr so we don't segfault
|
||||||
env->dbenv->txn_checkpoint(nMinutes ? gArgs.GetArg("-dblogsize", DEFAULT_WALLET_DBLOGSIZE) * 1024 : 0, nMinutes, 0);
|
env->dbenv->txn_checkpoint(nMinutes ? gArgs.GetArg("-dblogsize", DEFAULT_WALLET_DBLOGSIZE) * 1024 : 0, nMinutes, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BerkeleyDatabase::IncrementUpdateCounter()
|
void BerkeleyDatabase::IncrementUpdateCounter()
|
||||||
|
|
|
@ -370,7 +370,6 @@ void CWallet::UpgradeKeyMetadata()
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<WalletBatch> batch = MakeUnique<WalletBatch>(*database);
|
std::unique_ptr<WalletBatch> batch = MakeUnique<WalletBatch>(*database);
|
||||||
size_t cnt = 0;
|
|
||||||
for (auto& meta_pair : mapKeyMetadata) {
|
for (auto& meta_pair : mapKeyMetadata) {
|
||||||
CKeyMetadata& meta = meta_pair.second;
|
CKeyMetadata& meta = meta_pair.second;
|
||||||
if (!meta.hd_seed_id.IsNull() && !meta.has_key_origin && meta.hdKeypath != "s") { // If the hdKeypath is "s", that's the seed and it doesn't have a key origin
|
if (!meta.hd_seed_id.IsNull() && !meta.has_key_origin && meta.hdKeypath != "s") { // If the hdKeypath is "s", that's the seed and it doesn't have a key origin
|
||||||
|
@ -393,10 +392,6 @@ void CWallet::UpgradeKeyMetadata()
|
||||||
CPubKey pubkey;
|
CPubKey pubkey;
|
||||||
if (GetPubKey(meta_pair.first, pubkey)) {
|
if (GetPubKey(meta_pair.first, pubkey)) {
|
||||||
batch->WriteKeyMetadata(meta, pubkey, true);
|
batch->WriteKeyMetadata(meta, pubkey, true);
|
||||||
if (++cnt % 1000 == 0) {
|
|
||||||
// avoid creating overlarge in-memory batches in case the wallet contains large amounts of keys
|
|
||||||
batch.reset(new WalletBatch(*database));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -143,9 +143,11 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Access to the wallet database.
|
/** Access to the wallet database.
|
||||||
* This represents a single transaction at the
|
* Opens the database and provides read and write access to it. Each read and write is its own transaction.
|
||||||
* database. It will be committed when the object goes out of scope.
|
* Multiple operation transactions can be started using TxnBegin() and committed using TxnCommit()
|
||||||
* Optionally (on by default) it will flush to disk as well.
|
* Otherwise the transaction will be committed when the object goes out of scope.
|
||||||
|
* Optionally (on by default) it will flush to disk on close.
|
||||||
|
* Every 1000 writes will automatically trigger a flush to disk.
|
||||||
*/
|
*/
|
||||||
class WalletBatch
|
class WalletBatch
|
||||||
{
|
{
|
||||||
|
@ -157,6 +159,9 @@ private:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
m_database.IncrementUpdateCounter();
|
m_database.IncrementUpdateCounter();
|
||||||
|
if (m_database.nUpdateCounter % 1000 == 0) {
|
||||||
|
m_batch.Flush();
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,6 +172,9 @@ private:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
m_database.IncrementUpdateCounter();
|
m_database.IncrementUpdateCounter();
|
||||||
|
if (m_database.nUpdateCounter % 1000 == 0) {
|
||||||
|
m_batch.Flush();
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue