diff --git a/beater/beater.go b/beater/beater.go index 0b6d489eceb..fde6cd4c328 100644 --- a/beater/beater.go +++ b/beater/beater.go @@ -7,14 +7,18 @@ import ( "net/http" "regexp" + "sync" + "github.com/elastic/beats/libbeat/beat" "github.com/elastic/beats/libbeat/common" "github.com/elastic/beats/libbeat/logp" ) type beater struct { - config *Config - server *http.Server + config *Config + server *http.Server + mutex sync.RWMutex + stopped bool } // Creates beater @@ -36,7 +40,8 @@ func New(b *beat.Beat, ucfg *common.Config) (beat.Beater, error) { } bt := &beater{ - config: beaterConfig, + config: beaterConfig, + stopped: false, } return bt, nil } @@ -57,7 +62,14 @@ func (bt *beater) Run(b *beat.Beat) error { } go notifyListening(bt.config, pub.Send) + bt.mutex.Lock() + if bt.stopped { + defer bt.mutex.Unlock() + return nil + } + bt.server = newServer(bt.config, pub.Send) + bt.mutex.Unlock() err = run(bt.server, lis, bt.config) if err == http.ErrServerClosed { @@ -70,5 +82,10 @@ func (bt *beater) Run(b *beat.Beat) error { // Graceful shutdown func (bt *beater) Stop() { logp.Info("stopping apm-server...") - stop(bt.server, bt.config.ShutdownTimeout) + bt.mutex.Lock() + if bt.server != nil { + stop(bt.server, bt.config.ShutdownTimeout) + } + bt.stopped = true + bt.mutex.Unlock() }