@@ -167,23 +167,28 @@ func (net *Network) Start(id discover.NodeID) error {
167167// snapshots
168168func (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
250253func (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