mirror of
https://github.com/Retropex/bitcoin.git
synced 2025-06-02 15:32:34 +02:00
p2p: allow CAddrMan::GetAddr() by network, add doxygen
This commit is contained in:
parent
c38981e748
commit
a49f3ddbba
@ -287,7 +287,7 @@ protected:
|
|||||||
* @param[in] max_pct Maximum percentage of addresses to return (0 = all).
|
* @param[in] max_pct Maximum percentage of addresses to return (0 = all).
|
||||||
* @param[in] network Select only addresses of this network (nullopt = all).
|
* @param[in] network Select only addresses of this network (nullopt = all).
|
||||||
*/
|
*/
|
||||||
void GetAddr_(std::vector<CAddress>& vAddr, size_t max_addresses, size_t max_pct, std::optional<Network> network = std::nullopt) EXCLUSIVE_LOCKS_REQUIRED(cs);
|
void GetAddr_(std::vector<CAddress>& vAddr, size_t max_addresses, size_t max_pct, std::optional<Network> network) EXCLUSIVE_LOCKS_REQUIRED(cs);
|
||||||
|
|
||||||
/** We have successfully connected to this peer. Calling this function
|
/** We have successfully connected to this peer. Calling this function
|
||||||
* updates the CAddress's nTime, which is used in our IsTerrible()
|
* updates the CAddress's nTime, which is used in our IsTerrible()
|
||||||
@ -723,14 +723,20 @@ public:
|
|||||||
return addrRet;
|
return addrRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Return a bunch of addresses, selected at random.
|
/**
|
||||||
std::vector<CAddress> GetAddr(size_t max_addresses, size_t max_pct)
|
* Return all or many randomly selected addresses, optionally by network.
|
||||||
|
*
|
||||||
|
* @param[in] max_addresses Maximum number of addresses to return (0 = all).
|
||||||
|
* @param[in] max_pct Maximum percentage of addresses to return (0 = all).
|
||||||
|
* @param[in] network Select only addresses of this network (nullopt = all).
|
||||||
|
*/
|
||||||
|
std::vector<CAddress> GetAddr(size_t max_addresses, size_t max_pct, std::optional<Network> network)
|
||||||
{
|
{
|
||||||
Check();
|
Check();
|
||||||
std::vector<CAddress> vAddr;
|
std::vector<CAddress> vAddr;
|
||||||
{
|
{
|
||||||
LOCK(cs);
|
LOCK(cs);
|
||||||
GetAddr_(vAddr, max_addresses, max_pct);
|
GetAddr_(vAddr, max_addresses, max_pct, network);
|
||||||
}
|
}
|
||||||
Check();
|
Check();
|
||||||
return vAddr;
|
return vAddr;
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include <random.h>
|
#include <random.h>
|
||||||
#include <util/time.h>
|
#include <util/time.h>
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
/* A "source" is a source address from which we have received a bunch of other addresses. */
|
/* A "source" is a source address from which we have received a bunch of other addresses. */
|
||||||
@ -98,7 +99,7 @@ static void AddrManGetAddr(benchmark::Bench& bench)
|
|||||||
FillAddrMan(addrman);
|
FillAddrMan(addrman);
|
||||||
|
|
||||||
bench.run([&] {
|
bench.run([&] {
|
||||||
const auto& addresses = addrman.GetAddr(2500, 23);
|
const auto& addresses = addrman.GetAddr(/* max_addresses */ 2500, /* max_pct */ 23, /* network */ std::nullopt);
|
||||||
assert(addresses.size() > 0);
|
assert(addresses.size() > 0);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -2671,7 +2671,7 @@ CConnman::~CConnman()
|
|||||||
|
|
||||||
std::vector<CAddress> CConnman::GetAddresses(size_t max_addresses, size_t max_pct) const
|
std::vector<CAddress> CConnman::GetAddresses(size_t max_addresses, size_t max_pct) const
|
||||||
{
|
{
|
||||||
std::vector<CAddress> addresses = addrman.GetAddr(max_addresses, max_pct);
|
std::vector<CAddress> addresses = addrman.GetAddr(max_addresses, max_pct, /* network */ std::nullopt);
|
||||||
if (m_banman) {
|
if (m_banman) {
|
||||||
addresses.erase(std::remove_if(addresses.begin(), addresses.end(),
|
addresses.erase(std::remove_if(addresses.begin(), addresses.end(),
|
||||||
[this](const CAddress& addr){return m_banman->IsDiscouraged(addr) || m_banman->IsBanned(addr);}),
|
[this](const CAddress& addr){return m_banman->IsDiscouraged(addr) || m_banman->IsBanned(addr);}),
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
#include <boost/test/unit_test.hpp>
|
#include <boost/test/unit_test.hpp>
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
class CAddrManTest : public CAddrMan
|
class CAddrManTest : public CAddrMan
|
||||||
@ -392,7 +393,7 @@ BOOST_AUTO_TEST_CASE(addrman_getaddr)
|
|||||||
// Test: Sanity check, GetAddr should never return anything if addrman
|
// Test: Sanity check, GetAddr should never return anything if addrman
|
||||||
// is empty.
|
// is empty.
|
||||||
BOOST_CHECK_EQUAL(addrman.size(), 0U);
|
BOOST_CHECK_EQUAL(addrman.size(), 0U);
|
||||||
std::vector<CAddress> vAddr1 = addrman.GetAddr(/* max_addresses */ 0, /* max_pct */0);
|
std::vector<CAddress> vAddr1 = addrman.GetAddr(/* max_addresses */ 0, /* max_pct */ 0, /* network */ std::nullopt);
|
||||||
BOOST_CHECK_EQUAL(vAddr1.size(), 0U);
|
BOOST_CHECK_EQUAL(vAddr1.size(), 0U);
|
||||||
|
|
||||||
CAddress addr1 = CAddress(ResolveService("250.250.2.1", 8333), NODE_NONE);
|
CAddress addr1 = CAddress(ResolveService("250.250.2.1", 8333), NODE_NONE);
|
||||||
@ -415,15 +416,15 @@ BOOST_AUTO_TEST_CASE(addrman_getaddr)
|
|||||||
BOOST_CHECK(addrman.Add(addr4, source2));
|
BOOST_CHECK(addrman.Add(addr4, source2));
|
||||||
BOOST_CHECK(addrman.Add(addr5, source1));
|
BOOST_CHECK(addrman.Add(addr5, source1));
|
||||||
|
|
||||||
BOOST_CHECK_EQUAL(addrman.GetAddr(/* max_addresses */ 0, /* max_pct */ 0).size(), 5U);
|
BOOST_CHECK_EQUAL(addrman.GetAddr(/* max_addresses */ 0, /* max_pct */ 0, /* network */ std::nullopt).size(), 5U);
|
||||||
// Net processing asks for 23% of addresses. 23% of 5 is 1 rounded down.
|
// Net processing asks for 23% of addresses. 23% of 5 is 1 rounded down.
|
||||||
BOOST_CHECK_EQUAL(addrman.GetAddr(/* max_addresses */ 2500, /* max_pct */ 23).size(), 1U);
|
BOOST_CHECK_EQUAL(addrman.GetAddr(/* max_addresses */ 2500, /* max_pct */ 23, /* network */ std::nullopt).size(), 1U);
|
||||||
|
|
||||||
// Test: Ensure GetAddr works with new and tried addresses.
|
// Test: Ensure GetAddr works with new and tried addresses.
|
||||||
addrman.Good(CAddress(addr1, NODE_NONE));
|
addrman.Good(CAddress(addr1, NODE_NONE));
|
||||||
addrman.Good(CAddress(addr2, NODE_NONE));
|
addrman.Good(CAddress(addr2, NODE_NONE));
|
||||||
BOOST_CHECK_EQUAL(addrman.GetAddr(/* max_addresses */ 0, /* max_pct */ 0).size(), 5U);
|
BOOST_CHECK_EQUAL(addrman.GetAddr(/* max_addresses */ 0, /* max_pct */ 0, /* network */ std::nullopt).size(), 5U);
|
||||||
BOOST_CHECK_EQUAL(addrman.GetAddr(/* max_addresses */ 2500, /* max_pct */ 23).size(), 1U);
|
BOOST_CHECK_EQUAL(addrman.GetAddr(/* max_addresses */ 2500, /* max_pct */ 23, /* network */ std::nullopt).size(), 1U);
|
||||||
|
|
||||||
// Test: Ensure GetAddr still returns 23% when addrman has many addrs.
|
// Test: Ensure GetAddr still returns 23% when addrman has many addrs.
|
||||||
for (unsigned int i = 1; i < (8 * 256); i++) {
|
for (unsigned int i = 1; i < (8 * 256); i++) {
|
||||||
@ -438,7 +439,7 @@ BOOST_AUTO_TEST_CASE(addrman_getaddr)
|
|||||||
if (i % 8 == 0)
|
if (i % 8 == 0)
|
||||||
addrman.Good(addr);
|
addrman.Good(addr);
|
||||||
}
|
}
|
||||||
std::vector<CAddress> vAddr = addrman.GetAddr(/* max_addresses */ 2500, /* max_pct */ 23);
|
std::vector<CAddress> vAddr = addrman.GetAddr(/* max_addresses */ 2500, /* max_pct */ 23, /* network */ std::nullopt);
|
||||||
|
|
||||||
size_t percent23 = (addrman.size() * 23) / 100;
|
size_t percent23 = (addrman.size() * 23) / 100;
|
||||||
BOOST_CHECK_EQUAL(vAddr.size(), percent23);
|
BOOST_CHECK_EQUAL(vAddr.size(), percent23);
|
||||||
|
@ -60,7 +60,10 @@ FUZZ_TARGET_INIT(addrman, initialize_addrman)
|
|||||||
(void)addr_man.Select(fuzzed_data_provider.ConsumeBool());
|
(void)addr_man.Select(fuzzed_data_provider.ConsumeBool());
|
||||||
},
|
},
|
||||||
[&] {
|
[&] {
|
||||||
(void)addr_man.GetAddr(fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096), fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096));
|
(void)addr_man.GetAddr(
|
||||||
|
/* max_addresses */ fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096),
|
||||||
|
/* max_pct */ fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096),
|
||||||
|
/* network */ std::nullopt);
|
||||||
},
|
},
|
||||||
[&] {
|
[&] {
|
||||||
const std::optional<CAddress> opt_address = ConsumeDeserializable<CAddress>(fuzzed_data_provider);
|
const std::optional<CAddress> opt_address = ConsumeDeserializable<CAddress>(fuzzed_data_provider);
|
||||||
|
Loading…
Reference in New Issue
Block a user