Skip to content

Commit

Permalink
Merge pull request #6221
Browse files Browse the repository at this point in the history
c257a8c Prune: Support noncontiguous block files (Adam Weiss)
  • Loading branch information
laanwj committed Jun 11, 2015
2 parents 51870fc + c257a8c commit dd8fe82
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 19 deletions.
53 changes: 36 additions & 17 deletions src/init.cpp
Expand Up @@ -474,24 +474,43 @@ struct CImportingNow


// If we're using -prune with -reindex, then delete block files that will be ignored by the // 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 // 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 // is missing, do the same here to delete any later block files after a gap. Also delete all
// for block file 0, and if it doesn't exist, delete all the block files in the // rev files since they'll be rewritten by the reindex anyway. This ensures that vinfoBlockFile
// directory (since they won't be read by the reindex but will take up disk space). // is in sync with what's actually on disk by the time we start downloading, so that pruning
void DeleteAllBlockFiles() // works correctly.
void CleanupBlockRevFiles()
{ {
if (boost::filesystem::exists(GetBlockPosFilename(CDiskBlockPos(0, 0), "blk"))) using namespace boost::filesystem;
return; 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"); // Remove all block files that aren't part of a contiguous set starting at
boost::filesystem::path blocksdir = GetDataDir() / "blocks"; // zero by walking the ordered map (keys are block file indices) by
for (boost::filesystem::directory_iterator it(blocksdir); it != boost::filesystem::directory_iterator(); it++) { // keeping a separate counter. Once we hit a gap (or if 0 doesn't exist)
if (is_regular_file(*it)) { // start removing block files.
if ((it->path().filename().string().length() == 12) && int nContigCounter = 0;
(it->path().filename().string().substr(8,4) == ".dat") && BOOST_FOREACH(const PAIRTYPE(string, path)& item, mapBlockFiles) {
((it->path().filename().string().substr(0,3) == "blk") || if (atoi(item.first) == nContigCounter) {
(it->path().filename().string().substr(0,3) == "rev"))) nContigCounter++;
boost::filesystem::remove(it->path()); continue;
} }
remove(item.second);
} }
} }


Expand Down Expand Up @@ -1107,9 +1126,9 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)


if (fReindex) { if (fReindex) {
pblocktree->WriteReindexing(true); 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) if (fPruneMode)
DeleteAllBlockFiles(); CleanupBlockRevFiles();
} }


if (!LoadBlockIndex()) { if (!LoadBlockIndex()) {
Expand Down
4 changes: 2 additions & 2 deletions src/main.cpp
Expand Up @@ -3057,9 +3057,9 @@ void FindFilesToPrune(std::set<int>& setFilesToPrune)
if (nCurrentUsage + nBuffer < nPruneTarget) // are we below our target? if (nCurrentUsage + nBuffer < nPruneTarget) // are we below our target?
break; break;


// don't prune files that could have a block within MIN_BLOCKS_TO_KEEP of the main chain's tip // don't prune files that could have a block within MIN_BLOCKS_TO_KEEP of the main chain's tip but keep scanning
if (vinfoBlockFile[fileNumber].nHeightLast > nLastBlockWeCanPrune) if (vinfoBlockFile[fileNumber].nHeightLast > nLastBlockWeCanPrune)
break; continue;


PruneOneBlockFile(fileNumber); PruneOneBlockFile(fileNumber);
// Queue up the files for removal // Queue up the files for removal
Expand Down

0 comments on commit dd8fe82

Please sign in to comment.