Force on-the-fly compaction during pertxout upgrade

This commit is contained in:
Pieter Wuille 2017-06-02 17:52:37 -07:00
parent 0c70e845aa
commit efeb273305
2 changed files with 22 additions and 1 deletions

View file

@ -321,6 +321,23 @@ public:
pdb->GetApproximateSizes(&range, 1, &size); pdb->GetApproximateSizes(&range, 1, &size);
return 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 #endif // BITCOIN_DBWRAPPER_H

View file

@ -375,12 +375,13 @@ bool CCoinsViewDB::Upgrade() {
CDBBatch batch(db); CDBBatch batch(db);
uiInterface.SetProgressBreakAction(StartShutdown); uiInterface.SetProgressBreakAction(StartShutdown);
int reportDone = 0; int reportDone = 0;
std::pair<unsigned char, uint256> key;
std::pair<unsigned char, uint256> prev_key = {DB_COINS, uint256()};
while (pcursor->Valid()) { while (pcursor->Valid()) {
boost::this_thread::interruption_point(); boost::this_thread::interruption_point();
if (ShutdownRequested()) { if (ShutdownRequested()) {
break; break;
} }
std::pair<unsigned char, uint256> key;
if (pcursor->GetKey(key) && key.first == DB_COINS) { if (pcursor->GetKey(key) && key.first == DB_COINS) {
if (count++ % 256 == 0) { if (count++ % 256 == 0) {
uint32_t high = 0x100 * *key.second.begin() + *(key.second.begin() + 1); uint32_t high = 0x100 * *key.second.begin() + *(key.second.begin() + 1);
@ -409,6 +410,8 @@ bool CCoinsViewDB::Upgrade() {
if (batch.SizeEstimate() > batch_size) { if (batch.SizeEstimate() > batch_size) {
db.WriteBatch(batch); db.WriteBatch(batch);
batch.Clear(); batch.Clear();
db.CompactRange(prev_key, key);
prev_key = key;
} }
pcursor->Next(); pcursor->Next();
} else { } else {
@ -416,6 +419,7 @@ bool CCoinsViewDB::Upgrade() {
} }
} }
db.WriteBatch(batch); db.WriteBatch(batch);
db.CompactRange({DB_COINS, uint256()}, key);
uiInterface.SetProgressBreakAction(std::function<void(void)>()); uiInterface.SetProgressBreakAction(std::function<void(void)>());
LogPrintf("[%s].\n", ShutdownRequested() ? "CANCELLED" : "DONE"); LogPrintf("[%s].\n", ShutdownRequested() ? "CANCELLED" : "DONE");
return true; return true;