github.com/haalcala/mattermost-server-change-repo/v5@v5.33.2/app/cluster_discovery.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package app 5 6 import ( 7 "time" 8 9 "github.com/mattermost/mattermost-server/v5/mlog" 10 "github.com/mattermost/mattermost-server/v5/model" 11 ) 12 13 const ( 14 DiscoveryServiceWritePing = 60 * time.Second 15 ) 16 17 type ClusterDiscoveryService struct { 18 model.ClusterDiscovery 19 srv *Server 20 stop chan bool 21 } 22 23 func (s *Server) NewClusterDiscoveryService() *ClusterDiscoveryService { 24 ds := &ClusterDiscoveryService{ 25 ClusterDiscovery: model.ClusterDiscovery{}, 26 srv: s, 27 stop: make(chan bool), 28 } 29 30 return ds 31 } 32 33 func (a *App) NewClusterDiscoveryService() *ClusterDiscoveryService { 34 return a.Srv().NewClusterDiscoveryService() 35 } 36 37 func (cds *ClusterDiscoveryService) Start() { 38 err := cds.srv.Store.ClusterDiscovery().Cleanup() 39 if err != nil { 40 mlog.Warn("ClusterDiscoveryService failed to cleanup the outdated cluster discovery information", mlog.Err(err)) 41 } 42 43 exists, err := cds.srv.Store.ClusterDiscovery().Exists(&cds.ClusterDiscovery) 44 if err != nil { 45 mlog.Warn("ClusterDiscoveryService failed to check if row exists", mlog.String("ClusterDiscovery", cds.ClusterDiscovery.ToJson()), mlog.Err(err)) 46 } else if exists { 47 if _, err := cds.srv.Store.ClusterDiscovery().Delete(&cds.ClusterDiscovery); err != nil { 48 mlog.Warn("ClusterDiscoveryService failed to start clean", mlog.String("ClusterDiscovery", cds.ClusterDiscovery.ToJson()), mlog.Err(err)) 49 } 50 } 51 52 if err := cds.srv.Store.ClusterDiscovery().Save(&cds.ClusterDiscovery); err != nil { 53 mlog.Error("ClusterDiscoveryService failed to save", mlog.String("ClusterDiscovery", cds.ClusterDiscovery.ToJson()), mlog.Err(err)) 54 return 55 } 56 57 go func() { 58 mlog.Debug("ClusterDiscoveryService ping writer started", mlog.String("ClusterDiscovery", cds.ClusterDiscovery.ToJson())) 59 ticker := time.NewTicker(DiscoveryServiceWritePing) 60 defer func() { 61 ticker.Stop() 62 if _, err := cds.srv.Store.ClusterDiscovery().Delete(&cds.ClusterDiscovery); err != nil { 63 mlog.Warn("ClusterDiscoveryService failed to cleanup", mlog.String("ClusterDiscovery", cds.ClusterDiscovery.ToJson()), mlog.Err(err)) 64 } 65 mlog.Debug("ClusterDiscoveryService ping writer stopped", mlog.String("ClusterDiscovery", cds.ClusterDiscovery.ToJson())) 66 }() 67 68 for { 69 select { 70 case <-ticker.C: 71 if err := cds.srv.Store.ClusterDiscovery().SetLastPingAt(&cds.ClusterDiscovery); err != nil { 72 mlog.Error("ClusterDiscoveryService failed to write ping", mlog.String("ClusterDiscovery", cds.ClusterDiscovery.ToJson()), mlog.Err(err)) 73 } 74 case <-cds.stop: 75 return 76 } 77 } 78 }() 79 } 80 81 func (cds *ClusterDiscoveryService) Stop() { 82 cds.stop <- true 83 } 84 85 func (s *Server) IsLeader() bool { 86 if s.License() != nil && *s.Config().ClusterSettings.Enable && s.Cluster != nil { 87 return s.Cluster.IsLeader() 88 } 89 return true 90 } 91 92 func (a *App) IsLeader() bool { 93 return a.Srv().IsLeader() 94 } 95 96 func (a *App) GetClusterId() string { 97 if a.Cluster() == nil { 98 return "" 99 } 100 101 return a.Cluster().GetClusterId() 102 }