fix err concurrent map read and write with signers

This commit is contained in:
Nguyen Ba Tam 2018-12-04 14:10:18 +07:00
parent 1e930fdb95
commit a0d36b2fe4

View file

@ -806,23 +806,14 @@ func (c *Posv) UpdateMasternodes(chain consensus.ChainReader, header *types.Head
if err != nil {
return err
}
currentSigners := snap.GetSigners()
proposedSigners := make(map[common.Address]struct{})
// count all addresses in ms to be masternode
newSigners := make(map[common.Address]struct{})
for _, m := range ms {
proposedSigners[m.Address] = struct{}{}
snap.Signers[m.Address] = struct{}{}
}
// deactivate current masternodes which aren't in ms
for _, s := range currentSigners {
if _, ok := proposedSigners[s]; !ok {
delete(snap.Signers, s)
}
newSigners[m.Address] = struct{}{}
}
snap.Signers = newSigners
nm := []string{}
newSigners := snap.GetSigners()
for _, n := range newSigners {
nm = append(nm, n.String())
for _, n := range ms {
nm = append(nm, n.Address.String())
}
c.recents.Add(snap.Hash, snap)
log.Info("New set of masternodes has been updated to snapshot", "number", snap.Number, "hash", snap.Hash, "new masternodes", nm)