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  }