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 { if err != nil {
return err return err
} }
currentSigners := snap.GetSigners() newSigners := make(map[common.Address]struct{})
proposedSigners := make(map[common.Address]struct{})
// count all addresses in ms to be masternode
for _, m := range ms { for _, m := range ms {
proposedSigners[m.Address] = struct{}{} newSigners[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)
}
} }
snap.Signers = newSigners
nm := []string{} nm := []string{}
newSigners := snap.GetSigners() for _, n := range ms {
for _, n := range newSigners { nm = append(nm, n.Address.String())
nm = append(nm, n.String())
} }
c.recents.Add(snap.Hash, snap) 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) log.Info("New set of masternodes has been updated to snapshot", "number", snap.Number, "hash", snap.Hash, "new masternodes", nm)