aboutsummaryrefslogtreecommitdiff
path: root/src/addrdb.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/addrdb.cpp')
-rw-r--r--src/addrdb.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/addrdb.cpp b/src/addrdb.cpp
index 94518b88d8..9f3e2e7219 100644
--- a/src/addrdb.cpp
+++ b/src/addrdb.cpp
@@ -196,6 +196,15 @@ std::optional<bilingual_str> LoadAddrman(const std::vector<bool>& asmap, const A
addrman = std::make_unique<AddrMan>(asmap, /* deterministic */ false, /* consistency_check_ratio */ check_addrman);
LogPrintf("Creating peers.dat because the file was not found (%s)\n", fs::quoted(fs::PathToString(path_addr)));
DumpPeerAddresses(args, *addrman);
+ } catch (const InvalidAddrManVersionError&) {
+ if (!RenameOver(path_addr, (fs::path)path_addr + ".bak")) {
+ addrman = nullptr;
+ return strprintf(_("Failed to rename invalid peers.dat file. Please move or delete it and try again."));
+ }
+ // Addrman can be in an inconsistent state after failure, reset it
+ addrman = std::make_unique<AddrMan>(asmap, /* deterministic */ false, /* consistency_check_ratio */ check_addrman);
+ LogPrintf("Creating new peers.dat because the file version was not compatible (%s). Original backed up to peers.dat.bak\n", fs::quoted(fs::PathToString(path_addr)));
+ DumpPeerAddresses(args, *addrman);
} catch (const std::exception& e) {
addrman = nullptr;
return strprintf(_("Invalid or corrupt peers.dat (%s). If you believe this is a bug, please report it to %s. As a workaround, you can move the file (%s) out of the way (rename, move, or delete) to have a new one created on the next start."),