mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-06-03 01:33:20 +02:00
Merge bitcoin/bitcoin#22831: test: add addpeeraddress "tried", test addrman checks on restart with asmap
cdaab90662Add test for addrman consistency check on restart with asmap (Jon Atack)869f136816Add test for rpc addpeeraddress with "tried" argument (Jon Atack)ef242f5213Allow passing "tried" to rpc addpeeraddress to call CAddrMan::Good() (Jon Atack) Pull request description: This pull adds a `tried` argument to RPC addpeeraddress and a regression test for the recent addrman/asmap changes and issue. PR #22697 introduced a reproducible bug in commit181a1207that fails addrman consistency checks and causes it to significantly lose peer entries when the `-asmap` configuration option is used. The issue occurs upon bitcoind restart due to an initialization order change in `src/init.cpp` in that commit, whereby CAddrman asmap is set after deserializing `peers.dat`, rather than before. Issue reported on the `#bitcoin-core-dev` IRC channel starting at https://www.erisian.com.au/bitcoin-core-dev/log-2021-08-23.html#l-263. ``` addrman lost 22813 new and 2 tried addresses due to collisions or invalid addresses ADDRMAN CONSISTENCY CHECK FAILED!!! err=-17 bitcoind: ./addrman.h:707: void CAddrMan::Check() const: Assertion `false' failed. Aborted ``` How to reproduce: - `git checkout 181a1207`, build, and launch bitcoind with the `-asmap` and `-checkaddrman=1` configuration options enabled - restart bitcoind - bitcoind aborts on the second call to the addrman consistency checks in `CAddrMan::Check()` How to test this pull: - `git checkout 181a1207`, cherry pick the first commit of this branch, build, git checkout this branch, run `test/functional/rpc_net.py`, which should pass, and then run `test/functional/feature_asmap.py`, which should fail with the following output: ``` AssertionError: Unexpected stderr bitcoind: ./addrman.h:739: void CAddrMan::Check() const: Assertion `false' failed. ``` ACKs for top commit: jnewbery: utACKcdaab90662mzumsande: re-ACKcdaab90662(based on code review of diff to d586817) vasild: ACKcdaab90662Tree-SHA512: 0251a18fea629b62486fc907d7ab0e96c6df6fadb9e4d62cff018bc681afb6ac31e0e7258809c0a88f91e4a36c4fb0b16ed294ce47ef30585217de89c3342399
This commit is contained in:
@@ -192,6 +192,7 @@ static const CRPCConvertParam vRPCConvertParams[] =
|
||||
{ "unloadwallet", 1, "load_on_startup"},
|
||||
{ "getnodeaddresses", 0, "count"},
|
||||
{ "addpeeraddress", 1, "port"},
|
||||
{ "addpeeraddress", 2, "tried"},
|
||||
{ "stop", 0, "wait" },
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
@@ -921,6 +921,7 @@ static RPCHelpMan addpeeraddress()
|
||||
{
|
||||
{"address", RPCArg::Type::STR, RPCArg::Optional::NO, "The IP address of the peer"},
|
||||
{"port", RPCArg::Type::NUM, RPCArg::Optional::NO, "The port of the peer"},
|
||||
{"tried", RPCArg::Type::BOOL, RPCArg::Default{false}, "If true, attempt to add the peer to the tried addresses table"},
|
||||
},
|
||||
RPCResult{
|
||||
RPCResult::Type::OBJ, "", "",
|
||||
@@ -929,8 +930,8 @@ static RPCHelpMan addpeeraddress()
|
||||
},
|
||||
},
|
||||
RPCExamples{
|
||||
HelpExampleCli("addpeeraddress", "\"1.2.3.4\" 8333")
|
||||
+ HelpExampleRpc("addpeeraddress", "\"1.2.3.4\", 8333")
|
||||
HelpExampleCli("addpeeraddress", "\"1.2.3.4\" 8333 true")
|
||||
+ HelpExampleRpc("addpeeraddress", "\"1.2.3.4\", 8333, true")
|
||||
},
|
||||
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
|
||||
{
|
||||
@@ -941,6 +942,7 @@ static RPCHelpMan addpeeraddress()
|
||||
|
||||
const std::string& addr_string{request.params[0].get_str()};
|
||||
const uint16_t port{static_cast<uint16_t>(request.params[1].get_int())};
|
||||
const bool tried{request.params[2].isTrue()};
|
||||
|
||||
UniValue obj(UniValue::VOBJ);
|
||||
CNetAddr net_addr;
|
||||
@@ -951,7 +953,13 @@ static RPCHelpMan addpeeraddress()
|
||||
address.nTime = GetAdjustedTime();
|
||||
// The source address is set equal to the address. This is equivalent to the peer
|
||||
// announcing itself.
|
||||
if (node.addrman->Add({address}, address)) success = true;
|
||||
if (node.addrman->Add({address}, address)) {
|
||||
success = true;
|
||||
if (tried) {
|
||||
// Attempt to move the address to the tried addresses table.
|
||||
node.addrman->Good(address);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
obj.pushKV("success", success);
|
||||
|
||||
Reference in New Issue
Block a user