diff options
author | Wladimir J. van der Laan <laanwj@gmail.com> | 2017-08-01 13:01:59 +0200 |
---|---|---|
committer | Wladimir J. van der Laan <laanwj@gmail.com> | 2017-08-01 13:07:53 +0200 |
commit | 754aa02b8a72af0fa0a3b2bdfee1ef1b592aef6a (patch) | |
tree | 29fb27cbbe55059d4f6d231fe15a41a44a7a88af | |
parent | bd924241e7dc1b002190e81cad3cb8913757fde1 (diff) | |
parent | efeb273305e3e4d2c42e1e153de83c1cb6f0a28c (diff) | |
download | bitcoin-754aa02b8a72af0fa0a3b2bdfee1ef1b592aef6a.tar.xz |
Merge #10526: Force on-the-fly compaction during pertxout upgrade
efeb273 Force on-the-fly compaction during pertxout upgrade (Pieter Wuille)
Pull request description:
It seems that LevelDB tends to leave the old "per txid" UTXO entries in the database lying around for a significant amount of time during and after the per-txout upgrade. This introduces a `CompactRange` function in the database wrapper, and invokes it after every batch of updates in `CCoinsViewDB::Upgrade()`. This lowers temporary disk usage during and after the upgrade.
Tree-SHA512: fbf964c0a33f4e73709c999c8a2bfdef974779c15820907398a2f8828f5fa3e4e153ddd9031d6fc5083be81e22b999b9bd826fd063ad8b88f55c5e8342503290
-rw-r--r-- | src/dbwrapper.h | 17 | ||||
-rw-r--r-- | src/txdb.cpp | 6 |
2 files changed, 22 insertions, 1 deletions
diff --git a/src/dbwrapper.h b/src/dbwrapper.h index 24ef71bfbf..d36188652a 100644 --- a/src/dbwrapper.h +++ b/src/dbwrapper.h @@ -321,6 +321,23 @@ public: pdb->GetApproximateSizes(&range, 1, &size); return size; } + + /** + * Compact a certain range of keys in the database. + */ + template<typename K> + void CompactRange(const K& key_begin, const K& key_end) const + { + CDataStream ssKey1(SER_DISK, CLIENT_VERSION), ssKey2(SER_DISK, CLIENT_VERSION); + ssKey1.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); + ssKey2.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); + ssKey1 << key_begin; + ssKey2 << key_end; + leveldb::Slice slKey1(ssKey1.data(), ssKey1.size()); + leveldb::Slice slKey2(ssKey2.data(), ssKey2.size()); + pdb->CompactRange(&slKey1, &slKey2); + } + }; #endif // BITCOIN_DBWRAPPER_H diff --git a/src/txdb.cpp b/src/txdb.cpp index aa0b73a417..fd730c368a 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -375,12 +375,13 @@ bool CCoinsViewDB::Upgrade() { CDBBatch batch(db); uiInterface.SetProgressBreakAction(StartShutdown); int reportDone = 0; + std::pair<unsigned char, uint256> key; + std::pair<unsigned char, uint256> prev_key = {DB_COINS, uint256()}; while (pcursor->Valid()) { boost::this_thread::interruption_point(); if (ShutdownRequested()) { break; } - std::pair<unsigned char, uint256> key; if (pcursor->GetKey(key) && key.first == DB_COINS) { if (count++ % 256 == 0) { uint32_t high = 0x100 * *key.second.begin() + *(key.second.begin() + 1); @@ -409,6 +410,8 @@ bool CCoinsViewDB::Upgrade() { if (batch.SizeEstimate() > batch_size) { db.WriteBatch(batch); batch.Clear(); + db.CompactRange(prev_key, key); + prev_key = key; } pcursor->Next(); } else { @@ -416,6 +419,7 @@ bool CCoinsViewDB::Upgrade() { } } db.WriteBatch(batch); + db.CompactRange({DB_COINS, uint256()}, key); uiInterface.SetProgressBreakAction(std::function<void(void)>()); LogPrintf("[%s].\n", ShutdownRequested() ? "CANCELLED" : "DONE"); return true; |