p2p/simulations: changed NewEvent function to be used under network lock to avoid possible data race

This commit is contained in:
Elad Nachmias 2019-01-18 15:03:49 +07:00
parent 1b916f89c1
commit f1a242793b
2 changed files with 12 additions and 6 deletions

View file

@ -73,7 +73,8 @@ func NewEvent(v interface{}) *Event {
switch v := v.(type) { switch v := v.(type) {
case *Node: case *Node:
event.Type = EventTypeNode event.Type = EventTypeNode
event.Node = v node := *v
event.Node = &node
case *Conn: case *Conn:
event.Type = EventTypeConn event.Type = EventTypeConn
conn := *v conn := *v

View file

@ -168,7 +168,6 @@ func (net *Network) Start(id enode.ID) error {
// snapshots // snapshots
func (net *Network) startWithSnapshots(id enode.ID, snapshots map[string][]byte) error { func (net *Network) startWithSnapshots(id enode.ID, snapshots map[string][]byte) error {
net.lock.Lock() net.lock.Lock()
defer net.lock.Unlock()
node := net.getNode(id) node := net.getNode(id)
if node == nil { if node == nil {
@ -184,8 +183,10 @@ func (net *Network) startWithSnapshots(id enode.ID, snapshots map[string][]byte)
} }
node.Up = true node.Up = true
log.Info("Started node", "id", id) log.Info("Started node", "id", id)
ev := NewEvent(node)
net.lock.Unlock()
net.events.Send(NewEvent(node)) net.events.Send(ev)
// subscribe to peer events // subscribe to peer events
client, err := node.Client() client, err := node.Client()
@ -209,13 +210,14 @@ func (net *Network) watchPeerEvents(id enode.ID, events chan *p2p.PeerEvent, sub
// assume the node is now down // assume the node is now down
net.lock.Lock() net.lock.Lock()
defer net.lock.Unlock()
node := net.getNode(id) node := net.getNode(id)
if node == nil { if node == nil {
return return
} }
node.Up = false node.Up = false
net.events.Send(NewEvent(node)) ev := NewEvent(node)
net.lock.Unlock()
net.events.Send(ev)
}() }()
for { for {
select { select {
@ -270,7 +272,10 @@ func (net *Network) Stop(id enode.ID) error {
return err return err
} }
log.Info("Stopped node", "id", id, "err", err) log.Info("Stopped node", "id", id, "err", err)
net.events.Send(ControlEvent(node)) net.lock.Lock()
ev := ControlEvent(node)
net.lock.Unlock()
net.events.Send(ev)
return nil return nil
} }