Commit d596bea2 authored by Elad's avatar Elad Committed by Viktor Trón

swarm: fix uptime gauge update goroutine leak by introducing cleanup functions (#19040)

parent 555b3652
...@@ -79,7 +79,7 @@ type Swarm struct { ...@@ -79,7 +79,7 @@ type Swarm struct {
swap *swap.Swap swap *swap.Swap
stateStore *state.DBStore stateStore *state.DBStore
accountingMetrics *protocols.AccountingMetrics accountingMetrics *protocols.AccountingMetrics
startTime time.Time cleanupFuncs []func() error
tracerClose io.Closer tracerClose io.Closer
} }
...@@ -106,9 +106,10 @@ func NewSwarm(config *api.Config, mockStore *mock.NodeStore) (self *Swarm, err e ...@@ -106,9 +106,10 @@ func NewSwarm(config *api.Config, mockStore *mock.NodeStore) (self *Swarm, err e
} }
self = &Swarm{ self = &Swarm{
config: config, config: config,
backend: backend, backend: backend,
privateKey: config.ShiftPrivateKey(), privateKey: config.ShiftPrivateKey(),
cleanupFuncs: []func() error{},
} }
log.Debug("Setting up Swarm service components") log.Debug("Setting up Swarm service components")
...@@ -344,7 +345,7 @@ Start is called when the stack is started ...@@ -344,7 +345,7 @@ Start is called when the stack is started
*/ */
// implements the node.Service interface // implements the node.Service interface
func (self *Swarm) Start(srv *p2p.Server) error { func (self *Swarm) Start(srv *p2p.Server) error {
self.startTime = time.Now() startTime := time.Now()
self.tracerClose = tracing.Closer self.tracerClose = tracing.Closer
...@@ -396,26 +397,28 @@ func (self *Swarm) Start(srv *p2p.Server) error { ...@@ -396,26 +397,28 @@ func (self *Swarm) Start(srv *p2p.Server) error {
}() }()
} }
self.periodicallyUpdateGauges() doneC := make(chan struct{})
startCounter.Inc(1) self.cleanupFuncs = append(self.cleanupFuncs, func() error {
self.streamer.Start(srv) close(doneC)
return nil return nil
} })
func (self *Swarm) periodicallyUpdateGauges() { go func(time.Time) {
ticker := time.NewTicker(updateGaugesPeriod) for {
select {
go func() { case <-time.After(updateGaugesPeriod):
for range ticker.C { uptimeGauge.Update(time.Since(startTime).Nanoseconds())
self.updateGauges() requestsCacheGauge.Update(int64(self.netStore.RequestsCacheLen()))
case <-doneC:
return
}
} }
}() }(startTime)
}
func (self *Swarm) updateGauges() { startCounter.Inc(1)
uptimeGauge.Update(time.Since(self.startTime).Nanoseconds()) self.streamer.Start(srv)
requestsCacheGauge.Update(int64(self.netStore.RequestsCacheLen())) return nil
} }
// implements the node.Service interface // implements the node.Service interface
...@@ -452,6 +455,14 @@ func (self *Swarm) Stop() error { ...@@ -452,6 +455,14 @@ func (self *Swarm) Stop() error {
if self.stateStore != nil { if self.stateStore != nil {
self.stateStore.Close() self.stateStore.Close()
} }
for _, cleanF := range self.cleanupFuncs {
err = cleanF()
if err != nil {
log.Error("encountered an error while running cleanup function", "err", err)
break
}
}
return err return err
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment