|
|
|
@ -474,24 +474,43 @@ struct CImportingNow
@@ -474,24 +474,43 @@ struct CImportingNow
|
|
|
|
|
|
|
|
|
|
// If we're using -prune with -reindex, then delete block files that will be ignored by the
|
|
|
|
|
// reindex. Since reindexing works by starting at block file 0 and looping until a blockfile
|
|
|
|
|
// is missing, and since pruning works by deleting the oldest block file first, just check
|
|
|
|
|
// for block file 0, and if it doesn't exist, delete all the block files in the
|
|
|
|
|
// directory (since they won't be read by the reindex but will take up disk space).
|
|
|
|
|
void DeleteAllBlockFiles() |
|
|
|
|
// is missing, do the same here to delete any later block files after a gap. Also delete all
|
|
|
|
|
// rev files since they'll be rewritten by the reindex anyway. This ensures that vinfoBlockFile
|
|
|
|
|
// is in sync with what's actually on disk by the time we start downloading, so that pruning
|
|
|
|
|
// works correctly.
|
|
|
|
|
void CleanupBlockRevFiles() |
|
|
|
|
{ |
|
|
|
|
if (boost::filesystem::exists(GetBlockPosFilename(CDiskBlockPos(0, 0), "blk"))) |
|
|
|
|
return; |
|
|
|
|
using namespace boost::filesystem; |
|
|
|
|
map<string, path> mapBlockFiles; |
|
|
|
|
|
|
|
|
|
// Glob all blk?????.dat and rev?????.dat files from the blocks directory.
|
|
|
|
|
// Remove the rev files immediately and insert the blk file paths into an
|
|
|
|
|
// ordered map keyed by block file index.
|
|
|
|
|
LogPrintf("Removing unusable blk?????.dat and rev?????.dat files for -reindex with -prune\n"); |
|
|
|
|
path blocksdir = GetDataDir() / "blocks"; |
|
|
|
|
for (directory_iterator it(blocksdir); it != directory_iterator(); it++) { |
|
|
|
|
if (is_regular_file(*it) && |
|
|
|
|
it->path().filename().string().length() == 12 && |
|
|
|
|
it->path().filename().string().substr(8,4) == ".dat") |
|
|
|
|
{ |
|
|
|
|
if (it->path().filename().string().substr(0,3) == "blk") |
|
|
|
|
mapBlockFiles[it->path().filename().string().substr(3,5)] = it->path(); |
|
|
|
|
else if (it->path().filename().string().substr(0,3) == "rev") |
|
|
|
|
remove(it->path()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
LogPrintf("Removing all blk?????.dat and rev?????.dat files for -reindex with -prune\n"); |
|
|
|
|
boost::filesystem::path blocksdir = GetDataDir() / "blocks"; |
|
|
|
|
for (boost::filesystem::directory_iterator it(blocksdir); it != boost::filesystem::directory_iterator(); it++) { |
|
|
|
|
if (is_regular_file(*it)) { |
|
|
|
|
if ((it->path().filename().string().length() == 12) && |
|
|
|
|
(it->path().filename().string().substr(8,4) == ".dat") && |
|
|
|
|
((it->path().filename().string().substr(0,3) == "blk") || |
|
|
|
|
(it->path().filename().string().substr(0,3) == "rev"))) |
|
|
|
|
boost::filesystem::remove(it->path()); |
|
|
|
|
// Remove all block files that aren't part of a contiguous set starting at
|
|
|
|
|
// zero by walking the ordered map (keys are block file indices) by
|
|
|
|
|
// keeping a separate counter. Once we hit a gap (or if 0 doesn't exist)
|
|
|
|
|
// start removing block files.
|
|
|
|
|
int nContigCounter = 0; |
|
|
|
|
BOOST_FOREACH(const PAIRTYPE(string, path)& item, mapBlockFiles) { |
|
|
|
|
if (atoi(item.first) == nContigCounter) { |
|
|
|
|
nContigCounter++; |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
remove(item.second); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1107,9 +1126,9 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
@@ -1107,9 +1126,9 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
|
|
|
|
|
|
|
|
|
if (fReindex) { |
|
|
|
|
pblocktree->WriteReindexing(true); |
|
|
|
|
//If we're reindexing in prune mode, wipe away all our block and undo data files
|
|
|
|
|
//If we're reindexing in prune mode, wipe away unusable block files and all undo data files
|
|
|
|
|
if (fPruneMode) |
|
|
|
|
DeleteAllBlockFiles(); |
|
|
|
|
CleanupBlockRevFiles(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!LoadBlockIndex()) { |
|
|
|
|