From ccc57e56c3c6f2fb253ea5d8beb0ca995165b5c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Tue, 3 Mar 2020 17:52:59 +0100 Subject: [PATCH] MM-22235: Fixing stop/start behavior on Elasticsearch engine (#13887) Co-authored-by: mattermod --- app/app_iface.go | 2 +- app/license.go | 15 ++++++++++----- app/server.go | 10 +++++----- app/server_app_adapters.go | 2 +- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/app/app_iface.go b/app/app_iface.go index 41f6f902a4..466a697003 100644 --- a/app/app_iface.go +++ b/app/app_iface.go @@ -43,7 +43,7 @@ type AppIface interface { AddConfigListener(listener func(*model.Config, *model.Config)) string AddCursorIdsForPostList(originalList *model.PostList, afterPost, beforePost string, since int64, page, perPage int) AddDirectChannels(teamId string, user *model.User) *model.AppError - AddLicenseListener(listener func()) string + AddLicenseListener(listener func(oldLicense, newLicense *model.License)) string AddNotificationEmailToBatch(user *model.User, post *model.Post, team *model.Team) *model.AppError AddPublicKey(name string, key io.Reader) *model.AppError AddSamlIdpCertificate(fileData *multipart.FileHeader) *model.AppError diff --git a/app/license.go b/app/license.go index 2d0b1c38aa..023bba8f35 100644 --- a/app/license.go +++ b/app/license.go @@ -13,8 +13,6 @@ import ( ) func (a *App) LoadLicense() { - a.SetLicense(nil) - licenseId := "" props, err := a.Srv().Store.System().Get() if err == nil { @@ -37,6 +35,7 @@ func (a *App) LoadLicense() { record, err := a.Srv().Store.License().Get(licenseId) if err != nil { mlog.Info("License key from https://mattermost.com required to unlock enterprise features.") + a.SetLicense(nil) return } @@ -108,9 +107,15 @@ func (a *App) License() *model.License { } func (a *App) SetLicense(license *model.License) bool { + oldLicense := a.Srv().licenseValue.Load() + defer func() { for _, listener := range a.Srv().licenseListeners { - listener() + if oldLicense == nil { + listener(nil, license) + } else { + listener(oldLicense.(*model.License), license) + } } }() @@ -169,13 +174,13 @@ func (a *App) RemoveLicense() *model.AppError { return nil } -func (s *Server) AddLicenseListener(listener func()) string { +func (s *Server) AddLicenseListener(listener func(oldLicense, newLicense *model.License)) string { id := model.NewId() s.licenseListeners[id] = listener return id } -func (a *App) AddLicenseListener(listener func()) string { +func (a *App) AddLicenseListener(listener func(oldLicense, newLicense *model.License)) string { id := model.NewId() a.Srv().licenseListeners[id] = listener return id diff --git a/app/server.go b/app/server.go index 31c7d612e5..4f1acdc8a7 100644 --- a/app/server.go +++ b/app/server.go @@ -82,7 +82,7 @@ type Server struct { licenseValue atomic.Value clientLicenseValue atomic.Value - licenseListeners map[string]func() + licenseListeners map[string]func(*model.License, *model.License) timezones *timezones.Timezones @@ -143,7 +143,7 @@ func NewServer(options ...Option) (*Server, error) { s := &Server{ goroutineExitSignal: make(chan struct{}, 1), RootRouter: rootRouter, - licenseListeners: map[string]func(){}, + licenseListeners: map[string]func(*model.License, *model.License){}, clientConfig: make(map[string]string), } @@ -776,14 +776,14 @@ func (s *Server) StartElasticsearch() { } }) - s.AddLicenseListener(func() { - if s.License() != nil { + s.AddLicenseListener(func(oldLicense, newLicense *model.License) { + if oldLicense == nil && newLicense != nil { s.Go(func() { if err := s.Elasticsearch.Start(); err != nil { mlog.Error(err.Error()) } }) - } else { + } else if oldLicense != nil && newLicense == nil { s.Go(func() { if err := s.Elasticsearch.Stop(); err != nil { mlog.Error(err.Error()) diff --git a/app/server_app_adapters.go b/app/server_app_adapters.go index 470f56b6e2..2f13776cb6 100644 --- a/app/server_app_adapters.go +++ b/app/server_app_adapters.go @@ -39,7 +39,7 @@ func (s *Server) RunOldAppInitialization() error { s.FakeApp().Publish(message) }) }) - s.FakeApp().Srv().licenseListenerId = s.FakeApp().AddLicenseListener(func() { + s.FakeApp().Srv().licenseListenerId = s.FakeApp().AddLicenseListener(func(oldLicense, newLicense *model.License) { s.FakeApp().configOrLicenseListener() message := model.NewWebSocketEvent(model.WEBSOCKET_EVENT_LICENSE_CHANGED, "", "", "", nil)