github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/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 DISCOVERY_SERVICE_WRITE_PING = 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 (me *ClusterDiscoveryService) Start() { 38 err := me.srv.Store.ClusterDiscovery().Cleanup() 39 if err != nil { 40 mlog.Error("ClusterDiscoveryService failed to cleanup the outdated cluster discovery information", mlog.Err(err)) 41 } 42 43 exists, err := me.srv.Store.ClusterDiscovery().Exists(&me.ClusterDiscovery) 44 if err != nil { 45 mlog.Error("ClusterDiscoveryService failed to check if row exists", mlog.String("ClusterDiscovery", me.ClusterDiscovery.ToJson()), mlog.Err(err)) 46 } else { 47 if exists { 48 if _, err := me.srv.Store.ClusterDiscovery().Delete(&me.ClusterDiscovery); err != nil { 49 mlog.Error("ClusterDiscoveryService failed to start clean", mlog.String("ClusterDiscovery", me.ClusterDiscovery.ToJson()), mlog.Err(err)) 50 } 51 } 52 } 53 54 if err := me.srv.Store.ClusterDiscovery().Save(&me.ClusterDiscovery); err != nil { 55 mlog.Error("ClusterDiscoveryService failed to save", mlog.String("ClusterDiscovery", me.ClusterDiscovery.ToJson()), mlog.Err(err)) 56 return 57 } 58 59 go func() { 60 mlog.Debug("ClusterDiscoveryService ping writer started", mlog.String("ClusterDiscovery", me.ClusterDiscovery.ToJson())) 61 ticker := time.NewTicker(DISCOVERY_SERVICE_WRITE_PING) 62 defer func() { 63 ticker.Stop() 64 if _, err := me.srv.Store.ClusterDiscovery().Delete(&me.ClusterDiscovery); err != nil { 65 mlog.Error("ClusterDiscoveryService failed to cleanup", mlog.String("ClusterDiscovery", me.ClusterDiscovery.ToJson()), mlog.Err(err)) 66 } 67 mlog.Debug("ClusterDiscoveryService ping writer stopped", mlog.String("ClusterDiscovery", me.ClusterDiscovery.ToJson())) 68 }() 69 70 for { 71 select { 72 case <-ticker.C: 73 if err := me.srv.Store.ClusterDiscovery().SetLastPingAt(&me.ClusterDiscovery); err != nil { 74 mlog.Error("ClusterDiscoveryService failed to write ping", mlog.String("ClusterDiscovery", me.ClusterDiscovery.ToJson()), mlog.Err(err)) 75 } 76 case <-me.stop: 77 return 78 } 79 } 80 }() 81 } 82 83 func (me *ClusterDiscoveryService) Stop() { 84 me.stop <- true 85 } 86 87 func (s *Server) IsLeader() bool { 88 if s.License() != nil && *s.Config().ClusterSettings.Enable && s.Cluster != nil { 89 return s.Cluster.IsLeader() 90 } 91 return true 92 } 93 94 func (a *App) IsLeader() bool { 95 return a.Srv().IsLeader() 96 } 97 98 func (a *App) GetClusterId() string { 99 if a.Cluster() == nil { 100 return "" 101 } 102 103 return a.Cluster().GetClusterId() 104 }