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.
This commit is contained in:
Kaz Wesley 2016-04-27 09:26:33 -07:00
parent 08b37c5e06
commit f4ac02ee7c

View file

@ -2634,9 +2634,10 @@ void DumpBanlist()
CBanDB bandb; CBanDB bandb;
banmap_t banmap; banmap_t banmap;
CNode::SetBannedSetDirty(false);
CNode::GetBanned(banmap); CNode::GetBanned(banmap);
if (bandb.Write(banmap)) if (!bandb.Write(banmap))
CNode::SetBannedSetDirty(false); CNode::SetBannedSetDirty(true);
LogPrint("net", "Flushed %d banned node ips/subnets to banlist.dat %dms\n", LogPrint("net", "Flushed %d banned node ips/subnets to banlist.dat %dms\n",
banmap.size(), GetTimeMillis() - nStart); banmap.size(), GetTimeMillis() - nStart);