Skip to content

Commit 475a066

Browse files
acudskylenet
authored andcommitted
p2p/simulations: fix data race on swarm/network/simulations (ethereum#18464)
(cherry picked from commit 85a79b3)
1 parent 4625b12 commit 475a066

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

p2p/simulations/network.go

+15-4
Original file line numberDiff line numberDiff line change
@@ -168,24 +168,28 @@ func (net *Network) Start(id enode.ID) error {
168168
// snapshots
169169
func (net *Network) startWithSnapshots(id enode.ID, snapshots map[string][]byte) error {
170170
net.lock.Lock()
171-
defer net.lock.Unlock()
172171

173172
node := net.getNode(id)
174173
if node == nil {
174+
net.lock.Unlock()
175175
return fmt.Errorf("node %v does not exist", id)
176176
}
177177
if node.Up {
178+
net.lock.Unlock()
178179
return fmt.Errorf("node %v already up", id)
179180
}
180181
log.Trace("Starting node", "id", id, "adapter", net.nodeAdapter.Name())
181182
if err := node.Start(snapshots); err != nil {
183+
net.lock.Unlock()
182184
log.Warn("Node startup failed", "id", id, "err", err)
183185
return err
184186
}
185187
node.Up = true
186188
log.Info("Started node", "id", id)
189+
ev := NewEvent(node)
190+
net.lock.Unlock()
187191

188-
net.events.Send(NewEvent(node))
192+
net.events.Send(ev)
189193

190194
// subscribe to peer events
191195
client, err := node.Client()
@@ -210,12 +214,14 @@ func (net *Network) watchPeerEvents(id enode.ID, events chan *p2p.PeerEvent, sub
210214
// assume the node is now down
211215
net.lock.Lock()
212216
defer net.lock.Unlock()
217+
213218
node := net.getNode(id)
214219
if node == nil {
215220
return
216221
}
217222
node.Up = false
218-
net.events.Send(NewEvent(node))
223+
ev := NewEvent(node)
224+
net.events.Send(ev)
219225
}()
220226
for {
221227
select {
@@ -254,9 +260,11 @@ func (net *Network) Stop(id enode.ID) error {
254260
net.lock.Lock()
255261
node := net.getNode(id)
256262
if node == nil {
263+
net.lock.Unlock()
257264
return fmt.Errorf("node %v does not exist", id)
258265
}
259266
if !node.Up {
267+
net.lock.Unlock()
260268
return fmt.Errorf("node %v already down", id)
261269
}
262270
node.Up = false
@@ -270,7 +278,10 @@ func (net *Network) Stop(id enode.ID) error {
270278
return err
271279
}
272280
log.Info("Stopped node", "id", id, "err", err)
273-
net.events.Send(ControlEvent(node))
281+
net.lock.Lock()
282+
ev := ControlEvent(node)
283+
net.lock.Unlock()
284+
net.events.Send(ev)
274285
return nil
275286
}
276287

0 commit comments

Comments
 (0)