Skip to content

Commit a634215

Browse files
authored
fix(p2p/simulations): fix data race ethereum#18464 (#2341)
1 parent cf769c0 commit a634215

1 file changed

Lines changed: 28 additions & 16 deletions

File tree

p2p/simulations/network.go

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -167,23 +167,28 @@ func (net *Network) Start(id discover.NodeID) error {
167167
// snapshots
168168
func (net *Network) startWithSnapshots(id discover.NodeID, snapshots map[string][]byte) error {
169169
net.lock.Lock()
170-
defer net.lock.Unlock()
170+
171171
node := net.getNode(id)
172172
if node == nil {
173+
net.lock.Unlock()
173174
return fmt.Errorf("node %v does not exist", id)
174175
}
175176
if node.Up {
177+
net.lock.Unlock()
176178
return fmt.Errorf("node %v already up", id)
177179
}
178-
log.Trace(fmt.Sprintf("starting node %v: %v using %v", id, node.Up, net.nodeAdapter.Name()))
180+
log.Trace("Starting node", "id", id, "adapter", net.nodeAdapter.Name())
179181
if err := node.Start(snapshots); err != nil {
180-
log.Warn(fmt.Sprintf("start up failed: %v", err))
182+
net.lock.Unlock()
183+
log.Warn("Node startup failed", "id", id, "err", err)
181184
return err
182185
}
183186
node.Up = true
184-
log.Info(fmt.Sprintf("started node %v: %v", id, node.Up))
187+
log.Info("Started node", "id", id)
188+
ev := NewEvent(node)
189+
net.lock.Unlock()
185190

186-
net.events.Send(NewEvent(node))
191+
net.events.Send(ev)
187192

188193
// subscribe to peer events
189194
client, err := node.Client()
@@ -208,13 +213,14 @@ func (net *Network) watchPeerEvents(id discover.NodeID, events chan *p2p.PeerEve
208213
// assume the node is now down
209214
net.lock.Lock()
210215
defer net.lock.Unlock()
216+
211217
node := net.getNode(id)
212218
if node == nil {
213-
log.Error("Can not find node for id", "id", id)
214219
return
215220
}
216221
node.Up = false
217-
net.events.Send(NewEvent(node))
222+
ev := NewEvent(node)
223+
net.events.Send(ev)
218224
}()
219225
for {
220226
select {
@@ -226,13 +232,10 @@ func (net *Network) watchPeerEvents(id discover.NodeID, events chan *p2p.PeerEve
226232
switch event.Type {
227233
case p2p.PeerEventTypeAdd:
228234
net.DidConnect(id, peer)
229-
230235
case p2p.PeerEventTypeDrop:
231236
net.DidDisconnect(id, peer)
232-
233237
case p2p.PeerEventTypeMsgSend:
234238
net.DidSend(id, peer, event.Protocol, *event.MsgCode)
235-
236239
case p2p.PeerEventTypeMsgRecv:
237240
net.DidReceive(peer, id, event.Protocol, *event.MsgCode)
238241
}
@@ -249,21 +252,30 @@ func (net *Network) watchPeerEvents(id discover.NodeID, events chan *p2p.PeerEve
249252
// Stop stops the node with the given ID
250253
func (net *Network) Stop(id discover.NodeID) error {
251254
net.lock.Lock()
252-
defer net.lock.Unlock()
253255
node := net.getNode(id)
254256
if node == nil {
257+
net.lock.Unlock()
255258
return fmt.Errorf("node %v does not exist", id)
256259
}
257260
if !node.Up {
261+
net.lock.Unlock()
258262
return fmt.Errorf("node %v already down", id)
259263
}
260-
if err := node.Stop(); err != nil {
261-
return err
262-
}
263264
node.Up = false
264-
log.Info(fmt.Sprintf("stop node %v: %v", id, node.Up))
265+
net.lock.Unlock()
265266

266-
net.events.Send(ControlEvent(node))
267+
err := node.Stop()
268+
if err != nil {
269+
net.lock.Lock()
270+
node.Up = true
271+
net.lock.Unlock()
272+
return err
273+
}
274+
log.Info("Stopped node", "id", id, "err", err)
275+
net.lock.Lock()
276+
ev := ControlEvent(node)
277+
net.lock.Unlock()
278+
net.events.Send(ev)
267279
return nil
268280
}
269281

0 commit comments

Comments
 (0)