From ec7eb0fa80ce50f0c45c7f764bf4958224721ca0 Mon Sep 17 00:00:00 2001 From: Suhas Daftuar Date: Mon, 8 Sep 2014 13:29:14 -0400 Subject: [PATCH] When reindexing check for file before trying to open (refactored) --- src/init.cpp | 4 +++- src/main.cpp | 8 +++++++- src/main.h | 2 ++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index 31f64878f..4b95f2936 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -401,9 +401,11 @@ void ThreadImport(std::vector vImportFiles) int nFile = 0; while (true) { CDiskBlockPos pos(nFile, 0); + if (!boost::filesystem::exists(GetBlockPosFilename(pos, "blk"))) + break; // No block files left to reindex FILE *file = OpenBlockFile(pos, true); if (!file) - break; + break; // This error is logged in OpenBlockFile LogPrintf("Reindexing block file blk%05u.dat...\n", (unsigned int)nFile); LoadExternalBlockFile(file, &pos); nFile++; diff --git a/src/main.cpp b/src/main.cpp index a3b31b719..0816e3663 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2766,7 +2766,7 @@ FILE* OpenDiskFile(const CDiskBlockPos &pos, const char *prefix, bool fReadOnly) { if (pos.IsNull()) return NULL; - boost::filesystem::path path = GetDataDir() / "blocks" / strprintf("%s%05u.dat", prefix, pos.nFile); + boost::filesystem::path path = GetBlockPosFilename(pos, prefix); boost::filesystem::create_directories(path.parent_path()); FILE* file = fopen(path.string().c_str(), "rb+"); if (!file && !fReadOnly) @@ -2793,6 +2793,12 @@ FILE* OpenUndoFile(const CDiskBlockPos &pos, bool fReadOnly) { return OpenDiskFile(pos, "rev", fReadOnly); } +boost::filesystem::path GetBlockPosFilename(const CDiskBlockPos &pos, const char *prefix) +{ + boost::filesystem::path path = GetDataDir() / "blocks" / strprintf("%s%05u.dat", prefix, pos.nFile); + return path; +} + CBlockIndex * InsertBlockIndex(uint256 hash) { if (hash == 0) diff --git a/src/main.h b/src/main.h index 8c0a743e2..09de2187c 100644 --- a/src/main.h +++ b/src/main.h @@ -145,6 +145,8 @@ bool CheckDiskSpace(uint64_t nAdditionalBytes = 0); FILE* OpenBlockFile(const CDiskBlockPos &pos, bool fReadOnly = false); /** Open an undo file (rev?????.dat) */ FILE* OpenUndoFile(const CDiskBlockPos &pos, bool fReadOnly = false); +/** Translation to a filesystem path */ +boost::filesystem::path GetBlockPosFilename(const CDiskBlockPos &pos, const char *prefix); /** Import blocks from an external file */ bool LoadExternalBlockFile(FILE* fileIn, CDiskBlockPos *dbp = NULL); /** Initialize a new block tree database + block data on disk */