fix race that could fail to persist a ban (#1518)

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:
Oleg Girko 2017-07-11 07:15:14 +01:00 committed by UdjinM6
parent b47984f303
commit 9a8a290b87

View File

@ -2752,9 +2752,10 @@ void DumpBanlist()
CBanDB bandb; CBanDB bandb;
banmap_t banmap; banmap_t banmap;
CNode::GetBanned(banmap);
if (bandb.Write(banmap))
CNode::SetBannedSetDirty(false); CNode::SetBannedSetDirty(false);
CNode::GetBanned(banmap);
if (!bandb.Write(banmap))
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);