Skip to content

Commit fa5aeec

Browse files
author
MarcoFalke
committed
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.
1 parent e4aa9b1 commit fa5aeec

File tree

3 files changed

+25
-12
lines changed

3 files changed

+25
-12
lines changed

src/addrdb.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <univalue.h>
1919
#include <util/settings.h>
2020
#include <util/system.h>
21+
#include <util/translation.h>
2122

2223
namespace {
2324
template <typename Stream, typename Data>
@@ -187,6 +188,23 @@ bool ReadFromStream(CAddrMan& addr, CDataStream& ssPeers)
187188
return DeserializeDB(ssPeers, addr, false);
188189
}
189190

191+
std::optional<bilingual_str> LoadAddrman(const std::vector<bool>& asmap, const ArgsManager& args, std::unique_ptr<CAddrMan>& addrman)
192+
{
193+
auto check_addrman = std::clamp<int32_t>(args.GetArg("-checkaddrman", DEFAULT_ADDRMAN_CONSISTENCY_CHECKS), 0, 1000000);
194+
addrman = std::make_unique<CAddrMan>(asmap, /* deterministic */ false, /* consistency_check_ratio */ check_addrman);
195+
196+
int64_t nStart = GetTimeMillis();
197+
if (ReadPeerAddresses(args, *addrman)) {
198+
LogPrintf("Loaded %i addresses from peers.dat %dms\n", addrman->size(), GetTimeMillis() - nStart);
199+
} else {
200+
// Addrman can be in an inconsistent state after failure, reset it
201+
addrman = std::make_unique<CAddrMan>(asmap, /* deterministic */ false, /* consistency_check_ratio */ check_addrman);
202+
LogPrintf("Recreating peers.dat\n");
203+
DumpPeerAddresses(args, *addrman);
204+
}
205+
return std::nullopt;
206+
}
207+
190208
void DumpAnchors(const fs::path& anchors_db_path, const std::vector<CAddress>& anchors)
191209
{
192210
LOG_TIME_SECONDS(strprintf("Flush %d outbound block-relay-only peer addresses to anchors.dat", anchors.size()));

src/addrdb.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@
1010
#include <net_types.h> // For banmap_t
1111
#include <univalue.h>
1212

13+
#include <optional>
1314
#include <vector>
1415

1516
class ArgsManager;
1617
class CAddrMan;
1718
class CAddress;
1819
class CDataStream;
20+
struct bilingual_str;
1921

2022
bool DumpPeerAddresses(const ArgsManager& args, const CAddrMan& addr);
2123
bool ReadPeerAddresses(const ArgsManager& args, CAddrMan& addr);
@@ -46,6 +48,9 @@ class CBanDB
4648
bool Read(banmap_t& banSet);
4749
};
4850

51+
/** Returns an error string on failure */
52+
std::optional<bilingual_str> LoadAddrman(const std::vector<bool>& asmap, const ArgsManager& args, std::unique_ptr<CAddrMan>& addrman);
53+
4954
/**
5055
* Dump the anchor IP address database (anchors.dat)
5156
*

src/init.cpp

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,19 +1200,9 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
12001200
LogPrintf("Using /16 prefix for IP bucketing\n");
12011201
}
12021202

1203-
auto check_addrman = std::clamp<int32_t>(args.GetArg("-checkaddrman", DEFAULT_ADDRMAN_CONSISTENCY_CHECKS), 0, 1000000);
1204-
node.addrman = std::make_unique<CAddrMan>(asmap, /* deterministic */ false, /* consistency_check_ratio */ check_addrman);
1205-
1206-
// Load addresses from peers.dat
12071203
uiInterface.InitMessage(_("Loading P2P addresses…").translated);
1208-
int64_t nStart = GetTimeMillis();
1209-
if (ReadPeerAddresses(args, *node.addrman)) {
1210-
LogPrintf("Loaded %i addresses from peers.dat %dms\n", node.addrman->size(), GetTimeMillis() - nStart);
1211-
} else {
1212-
// Addrman can be in an inconsistent state after failure, reset it
1213-
node.addrman = std::make_unique<CAddrMan>(asmap, /* deterministic */ false, /* consistency_check_ratio */ check_addrman);
1214-
LogPrintf("Recreating peers.dat\n");
1215-
DumpPeerAddresses(args, *node.addrman);
1204+
if (const auto error{LoadAddrman(asmap, args, node.addrman)}) {
1205+
return InitError(*error);
12161206
}
12171207
}
12181208

0 commit comments

Comments
 (0)