0
0
Fork 0
mirror of https://github.com/bitcoin/bitcoin.git synced 2025-02-13 11:25:02 -05:00

Remove confusing CAddrDB

The class only stores the file path, reading it from a global. Globals
are confusing and make testing harder.

The method reading from a stream does not even use any class members, so
putting it in a class is also confusing.
This commit is contained in:
MarcoFalke 2021-08-21 11:22:21 +02:00
parent fa7f77b7d1
commit fade9a1a4d
No known key found for this signature in database
GPG key ID: CE2B75697E69A548
6 changed files with 22 additions and 33 deletions

View file

@ -170,22 +170,19 @@ bool CBanDB::Read(banmap_t& banSet)
return true; return true;
} }
CAddrDB::CAddrDB() bool DumpPeerAddresses(const ArgsManager& args, const CAddrMan& addr)
{
pathAddr = gArgs.GetDataDirNet() / "peers.dat";
}
bool CAddrDB::Write(const CAddrMan& addr)
{ {
const auto pathAddr = args.GetDataDirNet() / "peers.dat";
return SerializeFileDB("peers", pathAddr, addr, CLIENT_VERSION); return SerializeFileDB("peers", pathAddr, addr, CLIENT_VERSION);
} }
bool CAddrDB::Read(CAddrMan& addr) bool ReadPeerAddresses(const ArgsManager& args, CAddrMan& addr)
{ {
const auto pathAddr = args.GetDataDirNet() / "peers.dat";
return DeserializeFileDB(pathAddr, addr, CLIENT_VERSION); return DeserializeFileDB(pathAddr, addr, CLIENT_VERSION);
} }
bool CAddrDB::Read(CAddrMan& addr, CDataStream& ssPeers) bool ReadFromStream(CAddrMan& addr, CDataStream& ssPeers)
{ {
return DeserializeDB(ssPeers, addr, false); return DeserializeDB(ssPeers, addr, false);
} }

View file

@ -12,21 +12,15 @@
#include <vector> #include <vector>
class CAddress; class ArgsManager;
class CAddrMan; class CAddrMan;
class CAddress;
class CDataStream; class CDataStream;
/** Access to the (IP) address database (peers.dat) */ bool DumpPeerAddresses(const ArgsManager& args, const CAddrMan& addr);
class CAddrDB bool ReadPeerAddresses(const ArgsManager& args, CAddrMan& addr);
{ /** Only used by tests. */
private: bool ReadFromStream(CAddrMan& addr, CDataStream& ssPeers);
fs::path pathAddr;
public:
CAddrDB();
bool Write(const CAddrMan& addr);
bool Read(CAddrMan& addr);
static bool Read(CAddrMan& addr, CDataStream& ssPeers);
};
/** Access to the banlist database (banlist.json) */ /** Access to the banlist database (banlist.json) */
class CBanDB class CBanDB

View file

@ -1206,14 +1206,13 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
// Load addresses from peers.dat // Load addresses from peers.dat
uiInterface.InitMessage(_("Loading P2P addresses…").translated); uiInterface.InitMessage(_("Loading P2P addresses…").translated);
int64_t nStart = GetTimeMillis(); int64_t nStart = GetTimeMillis();
CAddrDB adb; if (ReadPeerAddresses(args, *node.addrman)) {
if (adb.Read(*node.addrman)) {
LogPrintf("Loaded %i addresses from peers.dat %dms\n", node.addrman->size(), GetTimeMillis() - nStart); LogPrintf("Loaded %i addresses from peers.dat %dms\n", node.addrman->size(), GetTimeMillis() - nStart);
} else { } else {
// Addrman can be in an inconsistent state after failure, reset it // 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); node.addrman = std::make_unique<CAddrMan>(asmap, /* deterministic */ false, /* consistency_check_ratio */ check_addrman);
LogPrintf("Recreating peers.dat\n"); LogPrintf("Recreating peers.dat\n");
adb.Write(*node.addrman); DumpPeerAddresses(args, *node.addrman);
} }
} }

View file

@ -1749,8 +1749,7 @@ void CConnman::DumpAddresses()
{ {
int64_t nStart = GetTimeMillis(); int64_t nStart = GetTimeMillis();
CAddrDB adb; DumpPeerAddresses(::gArgs, addrman);
adb.Write(addrman);
LogPrint(BCLog::NET, "Flushed %d addresses to peers.dat %dms\n", LogPrint(BCLog::NET, "Flushed %d addresses to peers.dat %dms\n",
addrman.size(), GetTimeMillis() - nStart); addrman.size(), GetTimeMillis() - nStart);

View file

@ -1003,7 +1003,7 @@ BOOST_AUTO_TEST_CASE(addrman_evictionworks)
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0");
} }
BOOST_AUTO_TEST_CASE(caddrdb_read) BOOST_AUTO_TEST_CASE(load_addrman)
{ {
CAddrManUncorrupted addrmanUncorrupted; CAddrManUncorrupted addrmanUncorrupted;
@ -1038,17 +1038,17 @@ BOOST_AUTO_TEST_CASE(caddrdb_read)
BOOST_CHECK(addrman1.size() == 3); BOOST_CHECK(addrman1.size() == 3);
BOOST_CHECK(exceptionThrown == false); BOOST_CHECK(exceptionThrown == false);
// Test that CAddrDB::Read creates an addrman with the correct number of addrs. // Test that ReadFromStream creates an addrman with the correct number of addrs.
CDataStream ssPeers2 = AddrmanToStream(addrmanUncorrupted); CDataStream ssPeers2 = AddrmanToStream(addrmanUncorrupted);
CAddrMan addrman2(/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 100); CAddrMan addrman2(/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 100);
BOOST_CHECK(addrman2.size() == 0); BOOST_CHECK(addrman2.size() == 0);
BOOST_CHECK(CAddrDB::Read(addrman2, ssPeers2)); BOOST_CHECK(ReadFromStream(addrman2, ssPeers2));
BOOST_CHECK(addrman2.size() == 3); BOOST_CHECK(addrman2.size() == 3);
} }
BOOST_AUTO_TEST_CASE(caddrdb_read_corrupted) BOOST_AUTO_TEST_CASE(load_addrman_corrupted)
{ {
CAddrManCorrupted addrmanCorrupted; CAddrManCorrupted addrmanCorrupted;
@ -1064,16 +1064,16 @@ BOOST_AUTO_TEST_CASE(caddrdb_read_corrupted)
} catch (const std::exception&) { } catch (const std::exception&) {
exceptionThrown = true; exceptionThrown = true;
} }
// Even through de-serialization failed addrman is not left in a clean state. // Even though de-serialization failed addrman is not left in a clean state.
BOOST_CHECK(addrman1.size() == 1); BOOST_CHECK(addrman1.size() == 1);
BOOST_CHECK(exceptionThrown); BOOST_CHECK(exceptionThrown);
// Test that CAddrDB::Read fails if peers.dat is corrupt // Test that ReadFromStream fails if peers.dat is corrupt
CDataStream ssPeers2 = AddrmanToStream(addrmanCorrupted); CDataStream ssPeers2 = AddrmanToStream(addrmanCorrupted);
CAddrMan addrman2(/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 100); CAddrMan addrman2(/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 100);
BOOST_CHECK(addrman2.size() == 0); BOOST_CHECK(addrman2.size() == 0);
BOOST_CHECK(!CAddrDB::Read(addrman2, ssPeers2)); BOOST_CHECK(!ReadFromStream(addrman2, ssPeers2));
} }

View file

@ -23,5 +23,5 @@ FUZZ_TARGET_INIT(data_stream_addr_man, initialize_data_stream_addr_man)
FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()}; FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
CDataStream data_stream = ConsumeDataStream(fuzzed_data_provider); CDataStream data_stream = ConsumeDataStream(fuzzed_data_provider);
CAddrMan addr_man(/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 0); CAddrMan addr_man(/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 0);
CAddrDB::Read(addr_man, data_stream); ReadFromStream(addr_man, data_stream);
} }