@@ -79,7 +79,7 @@ type Swarm struct {
79
79
swap * swap.Swap
80
80
stateStore * state.DBStore
81
81
accountingMetrics * protocols.AccountingMetrics
82
- startTime time. Time
82
+ cleanupFuncs [] func () error
83
83
84
84
tracerClose io.Closer
85
85
}
@@ -106,9 +106,10 @@ func NewSwarm(config *api.Config, mockStore *mock.NodeStore) (self *Swarm, err e
106
106
}
107
107
108
108
self = & Swarm {
109
- config : config ,
110
- backend : backend ,
111
- privateKey : config .ShiftPrivateKey (),
109
+ config : config ,
110
+ backend : backend ,
111
+ privateKey : config .ShiftPrivateKey (),
112
+ cleanupFuncs : []func () error {},
112
113
}
113
114
log .Debug ("Setting up Swarm service components" )
114
115
@@ -344,7 +345,7 @@ Start is called when the stack is started
344
345
*/
345
346
// implements the node.Service interface
346
347
func (self * Swarm ) Start (srv * p2p.Server ) error {
347
- self . startTime = time .Now ()
348
+ startTime : = time .Now ()
348
349
349
350
self .tracerClose = tracing .Closer
350
351
@@ -396,26 +397,28 @@ func (self *Swarm) Start(srv *p2p.Server) error {
396
397
}()
397
398
}
398
399
399
- self . periodicallyUpdateGauges ( )
400
+ doneC := make ( chan struct {} )
400
401
401
- startCounter . Inc ( 1 )
402
- self . streamer . Start ( srv )
403
- return nil
404
- }
402
+ self . cleanupFuncs = append ( self . cleanupFuncs , func () error {
403
+ close ( doneC )
404
+ return nil
405
+ })
405
406
406
- func (self * Swarm ) periodicallyUpdateGauges () {
407
- ticker := time .NewTicker (updateGaugesPeriod )
408
-
409
- go func () {
410
- for range ticker .C {
411
- self .updateGauges ()
407
+ go func (time.Time ) {
408
+ for {
409
+ select {
410
+ case <- time .After (updateGaugesPeriod ):
411
+ uptimeGauge .Update (time .Since (startTime ).Nanoseconds ())
412
+ requestsCacheGauge .Update (int64 (self .netStore .RequestsCacheLen ()))
413
+ case <- doneC :
414
+ return
415
+ }
412
416
}
413
- }()
414
- }
417
+ }(startTime )
415
418
416
- func ( self * Swarm ) updateGauges () {
417
- uptimeGauge . Update ( time . Since ( self .startTime ). Nanoseconds () )
418
- requestsCacheGauge . Update ( int64 ( self . netStore . RequestsCacheLen ()))
419
+ startCounter . Inc ( 1 )
420
+ self .streamer . Start ( srv )
421
+ return nil
419
422
}
420
423
421
424
// implements the node.Service interface
@@ -452,6 +455,14 @@ func (self *Swarm) Stop() error {
452
455
if self .stateStore != nil {
453
456
self .stateStore .Close ()
454
457
}
458
+
459
+ for _ , cleanF := range self .cleanupFuncs {
460
+ err = cleanF ()
461
+ if err != nil {
462
+ log .Error ("encountered an error while running cleanup function" , "err" , err )
463
+ break
464
+ }
465
+ }
455
466
return err
456
467
}
457
468
0 commit comments