@@ -168,24 +168,28 @@ func (net *Network) Start(id enode.ID) error {
168
168
// snapshots
169
169
func (net * Network ) startWithSnapshots (id enode.ID , snapshots map [string ][]byte ) error {
170
170
net .lock .Lock ()
171
- defer net .lock .Unlock ()
172
171
173
172
node := net .getNode (id )
174
173
if node == nil {
174
+ net .lock .Unlock ()
175
175
return fmt .Errorf ("node %v does not exist" , id )
176
176
}
177
177
if node .Up {
178
+ net .lock .Unlock ()
178
179
return fmt .Errorf ("node %v already up" , id )
179
180
}
180
181
log .Trace ("Starting node" , "id" , id , "adapter" , net .nodeAdapter .Name ())
181
182
if err := node .Start (snapshots ); err != nil {
183
+ net .lock .Unlock ()
182
184
log .Warn ("Node startup failed" , "id" , id , "err" , err )
183
185
return err
184
186
}
185
187
node .Up = true
186
188
log .Info ("Started node" , "id" , id )
189
+ ev := NewEvent (node )
190
+ net .lock .Unlock ()
187
191
188
- net .events .Send (NewEvent ( node ) )
192
+ net .events .Send (ev )
189
193
190
194
// subscribe to peer events
191
195
client , err := node .Client ()
@@ -210,12 +214,14 @@ func (net *Network) watchPeerEvents(id enode.ID, events chan *p2p.PeerEvent, sub
210
214
// assume the node is now down
211
215
net .lock .Lock ()
212
216
defer net .lock .Unlock ()
217
+
213
218
node := net .getNode (id )
214
219
if node == nil {
215
220
return
216
221
}
217
222
node .Up = false
218
- net .events .Send (NewEvent (node ))
223
+ ev := NewEvent (node )
224
+ net .events .Send (ev )
219
225
}()
220
226
for {
221
227
select {
@@ -254,9 +260,11 @@ func (net *Network) Stop(id enode.ID) error {
254
260
net .lock .Lock ()
255
261
node := net .getNode (id )
256
262
if node == nil {
263
+ net .lock .Unlock ()
257
264
return fmt .Errorf ("node %v does not exist" , id )
258
265
}
259
266
if ! node .Up {
267
+ net .lock .Unlock ()
260
268
return fmt .Errorf ("node %v already down" , id )
261
269
}
262
270
node .Up = false
@@ -270,7 +278,10 @@ func (net *Network) Stop(id enode.ID) error {
270
278
return err
271
279
}
272
280
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 )
274
285
return nil
275
286
}
276
287
0 commit comments