aboutsummaryrefslogtreecommitdiff
path: root/src/net.cpp
diff options
context:
space:
mode:
authorKaz Wesley <keziahw@gmail.com>2016-04-27 09:26:33 -0700
committerKaz Wesley <keziahw@gmail.com>2016-04-27 09:41:13 -0700
commitf4ac02ee7c6530c273503d8575a492e9b2ac1f13 (patch)
treef08df71bcdb9821bca7674739f02929f3b69849b /src/net.cpp
parent08b37c5e06bf1698c1d0e5905806382cbfa8cefd (diff)
downloadbitcoin-f4ac02ee7c6530c273503d8575a492e9b2ac1f13.tar.xz
fix race that could fail to persist a ban
DumpBanList currently does this: - with lock: take a copy of the banmap - perform I/O (write out the banmap) - with lock: mark the banmap non-dirty If a new ban is added during the I/O operation, it may never be persisted to disk. Reorder operations so that the data to be persisted cannot be older than the time at which the banmap was marked non-dirty.
Diffstat (limited to 'src/net.cpp')
-rw-r--r--src/net.cpp5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/net.cpp b/src/net.cpp
index 7dec8fc1cf..f566af24c4 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -2634,9 +2634,10 @@ void DumpBanlist()
CBanDB bandb;
banmap_t banmap;
+ CNode::SetBannedSetDirty(false);
CNode::GetBanned(banmap);
- if (bandb.Write(banmap))
- CNode::SetBannedSetDirty(false);
+ if (!bandb.Write(banmap))
+ CNode::SetBannedSetDirty(true);
LogPrint("net", "Flushed %d banned node ips/subnets to banlist.dat %dms\n",
banmap.size(), GetTimeMillis() - nStart);