mirror of
https://github.com/Retropex/bitcoin.git
synced 2025-06-02 15:32:34 +02:00
Move LoadAddrman from init to addrdb
Init should only concern itself with the initialization order, not the detailed initialization logic of every module. Also, inlining logic into a method that is ~800 lines of code, makes it impossible to unit test on its own.
This commit is contained in:
parent
e4aa9b15b9
commit
fa5aeec80c
@ -18,6 +18,7 @@
|
|||||||
#include <univalue.h>
|
#include <univalue.h>
|
||||||
#include <util/settings.h>
|
#include <util/settings.h>
|
||||||
#include <util/system.h>
|
#include <util/system.h>
|
||||||
|
#include <util/translation.h>
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
template <typename Stream, typename Data>
|
template <typename Stream, typename Data>
|
||||||
@ -187,6 +188,23 @@ bool ReadFromStream(CAddrMan& addr, CDataStream& ssPeers)
|
|||||||
return DeserializeDB(ssPeers, addr, false);
|
return DeserializeDB(ssPeers, addr, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::optional<bilingual_str> LoadAddrman(const std::vector<bool>& asmap, const ArgsManager& args, std::unique_ptr<CAddrMan>& addrman)
|
||||||
|
{
|
||||||
|
auto check_addrman = std::clamp<int32_t>(args.GetArg("-checkaddrman", DEFAULT_ADDRMAN_CONSISTENCY_CHECKS), 0, 1000000);
|
||||||
|
addrman = std::make_unique<CAddrMan>(asmap, /* deterministic */ false, /* consistency_check_ratio */ check_addrman);
|
||||||
|
|
||||||
|
int64_t nStart = GetTimeMillis();
|
||||||
|
if (ReadPeerAddresses(args, *addrman)) {
|
||||||
|
LogPrintf("Loaded %i addresses from peers.dat %dms\n", addrman->size(), GetTimeMillis() - nStart);
|
||||||
|
} else {
|
||||||
|
// Addrman can be in an inconsistent state after failure, reset it
|
||||||
|
addrman = std::make_unique<CAddrMan>(asmap, /* deterministic */ false, /* consistency_check_ratio */ check_addrman);
|
||||||
|
LogPrintf("Recreating peers.dat\n");
|
||||||
|
DumpPeerAddresses(args, *addrman);
|
||||||
|
}
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
void DumpAnchors(const fs::path& anchors_db_path, const std::vector<CAddress>& anchors)
|
void DumpAnchors(const fs::path& anchors_db_path, const std::vector<CAddress>& anchors)
|
||||||
{
|
{
|
||||||
LOG_TIME_SECONDS(strprintf("Flush %d outbound block-relay-only peer addresses to anchors.dat", anchors.size()));
|
LOG_TIME_SECONDS(strprintf("Flush %d outbound block-relay-only peer addresses to anchors.dat", anchors.size()));
|
||||||
|
@ -10,12 +10,14 @@
|
|||||||
#include <net_types.h> // For banmap_t
|
#include <net_types.h> // For banmap_t
|
||||||
#include <univalue.h>
|
#include <univalue.h>
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
class ArgsManager;
|
class ArgsManager;
|
||||||
class CAddrMan;
|
class CAddrMan;
|
||||||
class CAddress;
|
class CAddress;
|
||||||
class CDataStream;
|
class CDataStream;
|
||||||
|
struct bilingual_str;
|
||||||
|
|
||||||
bool DumpPeerAddresses(const ArgsManager& args, const CAddrMan& addr);
|
bool DumpPeerAddresses(const ArgsManager& args, const CAddrMan& addr);
|
||||||
bool ReadPeerAddresses(const ArgsManager& args, CAddrMan& addr);
|
bool ReadPeerAddresses(const ArgsManager& args, CAddrMan& addr);
|
||||||
@ -46,6 +48,9 @@ public:
|
|||||||
bool Read(banmap_t& banSet);
|
bool Read(banmap_t& banSet);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Returns an error string on failure */
|
||||||
|
std::optional<bilingual_str> LoadAddrman(const std::vector<bool>& asmap, const ArgsManager& args, std::unique_ptr<CAddrMan>& addrman);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dump the anchor IP address database (anchors.dat)
|
* Dump the anchor IP address database (anchors.dat)
|
||||||
*
|
*
|
||||||
|
14
src/init.cpp
14
src/init.cpp
@ -1200,19 +1200,9 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
|
|||||||
LogPrintf("Using /16 prefix for IP bucketing\n");
|
LogPrintf("Using /16 prefix for IP bucketing\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
auto check_addrman = std::clamp<int32_t>(args.GetArg("-checkaddrman", DEFAULT_ADDRMAN_CONSISTENCY_CHECKS), 0, 1000000);
|
|
||||||
node.addrman = std::make_unique<CAddrMan>(asmap, /* deterministic */ false, /* consistency_check_ratio */ check_addrman);
|
|
||||||
|
|
||||||
// Load addresses from peers.dat
|
|
||||||
uiInterface.InitMessage(_("Loading P2P addresses…").translated);
|
uiInterface.InitMessage(_("Loading P2P addresses…").translated);
|
||||||
int64_t nStart = GetTimeMillis();
|
if (const auto error{LoadAddrman(asmap, args, node.addrman)}) {
|
||||||
if (ReadPeerAddresses(args, *node.addrman)) {
|
return InitError(*error);
|
||||||
LogPrintf("Loaded %i addresses from peers.dat %dms\n", node.addrman->size(), GetTimeMillis() - nStart);
|
|
||||||
} else {
|
|
||||||
// Addrman can be in an inconsistent state after failure, reset it
|
|
||||||
node.addrman = std::make_unique<CAddrMan>(asmap, /* deterministic */ false, /* consistency_check_ratio */ check_addrman);
|
|
||||||
LogPrintf("Recreating peers.dat\n");
|
|
||||||
DumpPeerAddresses(args, *node.addrman);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user