aboutsummaryrefslogtreecommitdiff
path: root/src/banman.cpp
diff options
context:
space:
mode:
authorVasil Dimov <vd@FreeBSD.org>2021-01-14 09:33:04 +0100
committerVasil Dimov <vd@FreeBSD.org>2021-06-21 14:39:44 +0200
commitd197977ae2076903ed12ab7616a7f93e88be02e1 (patch)
treef52c91c3abad65cffa13a8334c37da415c708c70 /src/banman.cpp
parent6a67366fdc3e1d383fe7cbfa209d7e85f0d96638 (diff)
downloadbitcoin-d197977ae2076903ed12ab7616a7f93e88be02e1.tar.xz
banman: save the banlist in a JSON format on disk
Save the banlist in `banlist.json` instead of `banlist.dat`. This makes it possible to store Tor v3 entries in the banlist on disk (and any other addresses that cannot be serialized in addrv1 format). Only read `banlist.dat` if it exists and `banlist.json` does not exist (first start after an upgrade). Supersedes https://github.com/bitcoin/bitcoin/pull/20904 Resolves https://github.com/bitcoin/bitcoin/issues/19748
Diffstat (limited to 'src/banman.cpp')
-rw-r--r--src/banman.cpp33
1 files changed, 12 insertions, 21 deletions
diff --git a/src/banman.cpp b/src/banman.cpp
index bb97fc4809..d2437e6733 100644
--- a/src/banman.cpp
+++ b/src/banman.cpp
@@ -18,20 +18,18 @@ BanMan::BanMan(fs::path ban_file, CClientUIInterface* client_interface, int64_t
if (m_client_interface) m_client_interface->InitMessage(_("Loading banlist…").translated);
int64_t n_start = GetTimeMillis();
- m_is_dirty = false;
- banmap_t banmap;
- if (m_ban_db.Read(banmap)) {
- SetBanned(banmap); // thread save setter
- SetBannedSetDirty(false); // no need to write down, just read data
- SweepBanned(); // sweep out unused entries
+ if (m_ban_db.Read(m_banned, m_is_dirty)) {
+ SweepBanned(); // sweep out unused entries
- LogPrint(BCLog::NET, "Loaded %d banned node ips/subnets from banlist.dat %dms\n",
- m_banned.size(), GetTimeMillis() - n_start);
+ LogPrint(BCLog::NET, "Loaded %d banned node addresses/subnets %dms\n", m_banned.size(),
+ GetTimeMillis() - n_start);
} else {
- LogPrintf("Recreating banlist.dat\n");
- SetBannedSetDirty(true); // force write
- DumpBanlist();
+ LogPrintf("Recreating the banlist database\n");
+ m_banned = {};
+ m_is_dirty = true;
}
+
+ DumpBanlist();
}
BanMan::~BanMan()
@@ -53,8 +51,8 @@ void BanMan::DumpBanlist()
SetBannedSetDirty(false);
}
- LogPrint(BCLog::NET, "Flushed %d banned node ips/subnets to banlist.dat %dms\n",
- banmap.size(), GetTimeMillis() - n_start);
+ LogPrint(BCLog::NET, "Flushed %d banned node addresses/subnets to disk %dms\n", banmap.size(),
+ GetTimeMillis() - n_start);
}
void BanMan::ClearBanned()
@@ -167,13 +165,6 @@ void BanMan::GetBanned(banmap_t& banmap)
banmap = m_banned; //create a thread safe copy
}
-void BanMan::SetBanned(const banmap_t& banmap)
-{
- LOCK(m_cs_banned);
- m_banned = banmap;
- m_is_dirty = true;
-}
-
void BanMan::SweepBanned()
{
int64_t now = GetTime();
@@ -188,7 +179,7 @@ void BanMan::SweepBanned()
m_banned.erase(it++);
m_is_dirty = true;
notify_ui = true;
- LogPrint(BCLog::NET, "%s: Removed banned node ip/subnet from banlist.dat: %s\n", __func__, sub_net.ToString());
+ LogPrint(BCLog::NET, "Removed banned node address/subnet: %s\n", sub_net.ToString());
} else
++it;
}