diff options
author | MarcoFalke <falke.marco@gmail.com> | 2022-02-25 08:45:03 +0100 |
---|---|---|
committer | MarcoFalke <falke.marco@gmail.com> | 2022-02-25 08:45:11 +0100 |
commit | b00b60ed4f27066656e45635f1386e6b1550c6ed (patch) | |
tree | 6b87c8cdc015efac7007605c9402533e9ca0b2d7 /src/addrdb.cpp | |
parent | f1ce67f09fbaba4013443bce416e46e5b2d37c19 (diff) | |
parent | d41ed3215355582879c8eb6c99c2da33852f6cb1 (diff) | |
download | bitcoin-b00b60ed4f27066656e45635f1386e6b1550c6ed.tar.xz |
Merge bitcoin/bitcoin#24201: p2p: Avoid InitError when downgrading peers.dat
d41ed3215355582879c8eb6c99c2da33852f6cb1 p2p: Avoid InitError when downgrading peers.dat (junderw)
Pull request description:
fixes #24188 (also see https://github.com/bitcoin/bitcoin/pull/22762#issuecomment-951063826)
When downgrading, a peers.dat with a future version that has a minimum
required version larger than the downgraded Bitcoin Core version would cause an InitError.
This commit changes this behavior to overwrite the existing peers.dat with
a new empty one.
ACKs for top commit:
prayank23:
reACK https://github.com/bitcoin/bitcoin/pull/24201/commits/d41ed3215355582879c8eb6c99c2da33852f6cb1
kallewoof:
reACK d41ed3215355582879c8eb6c99c2da33852f6cb1
Tree-SHA512: c8e625fe36ce0b1aab6c8ef7241c8954038bb856f2de27bdc4814dc9a60e51be28815c7d77d0f96eace49687a0cea02deb713978bbd3a5add742f50a675f2a40
Diffstat (limited to 'src/addrdb.cpp')
-rw-r--r-- | src/addrdb.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/addrdb.cpp b/src/addrdb.cpp index 4f22e688db..0fa8f3c3da 100644 --- a/src/addrdb.cpp +++ b/src/addrdb.cpp @@ -197,6 +197,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."), |