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  }