github.com/adacta-ru/mattermost-server/v5@v5.31.1/jobs/workers.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package jobs
     5  
     6  import (
     7  	"sync"
     8  
     9  	"github.com/adacta-ru/mattermost-server/v5/mlog"
    10  	"github.com/adacta-ru/mattermost-server/v5/model"
    11  	"github.com/adacta-ru/mattermost-server/v5/services/configservice"
    12  )
    13  
    14  type Workers struct {
    15  	startOnce     sync.Once
    16  	ConfigService configservice.ConfigService
    17  	Watcher       *Watcher
    18  
    19  	DataRetention            model.Worker
    20  	MessageExport            model.Worker
    21  	ElasticsearchIndexing    model.Worker
    22  	ElasticsearchAggregation model.Worker
    23  	LdapSync                 model.Worker
    24  	Migrations               model.Worker
    25  	Plugins                  model.Worker
    26  	BleveIndexing            model.Worker
    27  	ExpiryNotify             model.Worker
    28  	ProductNotices           model.Worker
    29  	ActiveUsers              model.Worker
    30  	ImportProcess            model.Worker
    31  	Cloud                    model.Worker
    32  
    33  	listenerId string
    34  }
    35  
    36  func (srv *JobServer) InitWorkers() *Workers {
    37  	workers := &Workers{
    38  		ConfigService: srv.ConfigService,
    39  	}
    40  	workers.Watcher = srv.MakeWatcher(workers, DEFAULT_WATCHER_POLLING_INTERVAL)
    41  
    42  	if srv.DataRetentionJob != nil {
    43  		workers.DataRetention = srv.DataRetentionJob.MakeWorker()
    44  	}
    45  
    46  	if srv.MessageExportJob != nil {
    47  		workers.MessageExport = srv.MessageExportJob.MakeWorker()
    48  	}
    49  
    50  	if elasticsearchIndexerInterface := srv.ElasticsearchIndexer; elasticsearchIndexerInterface != nil {
    51  		workers.ElasticsearchIndexing = elasticsearchIndexerInterface.MakeWorker()
    52  	}
    53  
    54  	if elasticsearchAggregatorInterface := srv.ElasticsearchAggregator; elasticsearchAggregatorInterface != nil {
    55  		workers.ElasticsearchAggregation = elasticsearchAggregatorInterface.MakeWorker()
    56  	}
    57  
    58  	if ldapSyncInterface := srv.LdapSync; ldapSyncInterface != nil {
    59  		workers.LdapSync = ldapSyncInterface.MakeWorker()
    60  	}
    61  
    62  	if migrationsInterface := srv.Migrations; migrationsInterface != nil {
    63  		workers.Migrations = migrationsInterface.MakeWorker()
    64  	}
    65  
    66  	if pluginsInterface := srv.Plugins; pluginsInterface != nil {
    67  		workers.Plugins = pluginsInterface.MakeWorker()
    68  	}
    69  
    70  	if bleveIndexerInterface := srv.BleveIndexer; bleveIndexerInterface != nil {
    71  		workers.BleveIndexing = bleveIndexerInterface.MakeWorker()
    72  	}
    73  
    74  	if expiryNotifyInterface := srv.ExpiryNotify; expiryNotifyInterface != nil {
    75  		workers.ExpiryNotify = expiryNotifyInterface.MakeWorker()
    76  	}
    77  
    78  	if activeUsersInterface := srv.ActiveUsers; activeUsersInterface != nil {
    79  		workers.ActiveUsers = activeUsersInterface.MakeWorker()
    80  	}
    81  
    82  	if productNoticesInterface := srv.ProductNotices; productNoticesInterface != nil {
    83  		workers.ProductNotices = productNoticesInterface.MakeWorker()
    84  	}
    85  
    86  	if importProcessInterface := srv.ImportProcess; importProcessInterface != nil {
    87  		workers.ImportProcess = importProcessInterface.MakeWorker()
    88  	}
    89  
    90  	if cloudInterface := srv.Cloud; cloudInterface != nil {
    91  		workers.Cloud = cloudInterface.MakeWorker()
    92  	}
    93  
    94  	return workers
    95  }
    96  
    97  func (workers *Workers) Start() *Workers {
    98  	mlog.Info("Starting workers")
    99  
   100  	workers.startOnce.Do(func() {
   101  		if workers.DataRetention != nil && (*workers.ConfigService.Config().DataRetentionSettings.EnableMessageDeletion || *workers.ConfigService.Config().DataRetentionSettings.EnableFileDeletion) {
   102  			go workers.DataRetention.Run()
   103  		}
   104  
   105  		if workers.MessageExport != nil && *workers.ConfigService.Config().MessageExportSettings.EnableExport {
   106  			go workers.MessageExport.Run()
   107  		}
   108  
   109  		if workers.ElasticsearchIndexing != nil && *workers.ConfigService.Config().ElasticsearchSettings.EnableIndexing {
   110  			go workers.ElasticsearchIndexing.Run()
   111  		}
   112  
   113  		if workers.ElasticsearchAggregation != nil && *workers.ConfigService.Config().ElasticsearchSettings.EnableIndexing {
   114  			go workers.ElasticsearchAggregation.Run()
   115  		}
   116  
   117  		if workers.LdapSync != nil && *workers.ConfigService.Config().LdapSettings.EnableSync {
   118  			go workers.LdapSync.Run()
   119  		}
   120  
   121  		if workers.Migrations != nil {
   122  			go workers.Migrations.Run()
   123  		}
   124  
   125  		if workers.Plugins != nil {
   126  			go workers.Plugins.Run()
   127  		}
   128  
   129  		if workers.BleveIndexing != nil && *workers.ConfigService.Config().BleveSettings.EnableIndexing && *workers.ConfigService.Config().BleveSettings.IndexDir != "" {
   130  			go workers.BleveIndexing.Run()
   131  		}
   132  
   133  		if workers.ExpiryNotify != nil {
   134  			go workers.ExpiryNotify.Run()
   135  		}
   136  
   137  		if workers.ActiveUsers != nil {
   138  			go workers.ActiveUsers.Run()
   139  		}
   140  
   141  		if workers.ProductNotices != nil {
   142  			go workers.ProductNotices.Run()
   143  		}
   144  
   145  		if workers.ImportProcess != nil {
   146  			go workers.ImportProcess.Run()
   147  		}
   148  
   149  		if workers.Cloud != nil {
   150  			go workers.Cloud.Run()
   151  		}
   152  
   153  		go workers.Watcher.Start()
   154  	})
   155  
   156  	workers.listenerId = workers.ConfigService.AddConfigListener(workers.handleConfigChange)
   157  
   158  	return workers
   159  }
   160  
   161  func (workers *Workers) handleConfigChange(oldConfig *model.Config, newConfig *model.Config) {
   162  	mlog.Debug("Workers received config change.")
   163  
   164  	if workers.DataRetention != nil {
   165  		if (!*oldConfig.DataRetentionSettings.EnableMessageDeletion && !*oldConfig.DataRetentionSettings.EnableFileDeletion) && (*newConfig.DataRetentionSettings.EnableMessageDeletion || *newConfig.DataRetentionSettings.EnableFileDeletion) {
   166  			go workers.DataRetention.Run()
   167  		} else if (*oldConfig.DataRetentionSettings.EnableMessageDeletion || *oldConfig.DataRetentionSettings.EnableFileDeletion) && (!*newConfig.DataRetentionSettings.EnableMessageDeletion && !*newConfig.DataRetentionSettings.EnableFileDeletion) {
   168  			workers.DataRetention.Stop()
   169  		}
   170  	}
   171  
   172  	if workers.MessageExport != nil {
   173  		if !*oldConfig.MessageExportSettings.EnableExport && *newConfig.MessageExportSettings.EnableExport {
   174  			go workers.MessageExport.Run()
   175  		} else if *oldConfig.MessageExportSettings.EnableExport && !*newConfig.MessageExportSettings.EnableExport {
   176  			workers.MessageExport.Stop()
   177  		}
   178  	}
   179  
   180  	if workers.ElasticsearchIndexing != nil {
   181  		if !*oldConfig.ElasticsearchSettings.EnableIndexing && *newConfig.ElasticsearchSettings.EnableIndexing {
   182  			go workers.ElasticsearchIndexing.Run()
   183  		} else if *oldConfig.ElasticsearchSettings.EnableIndexing && !*newConfig.ElasticsearchSettings.EnableIndexing {
   184  			workers.ElasticsearchIndexing.Stop()
   185  		}
   186  	}
   187  
   188  	if workers.ElasticsearchAggregation != nil {
   189  		if !*oldConfig.ElasticsearchSettings.EnableIndexing && *newConfig.ElasticsearchSettings.EnableIndexing {
   190  			go workers.ElasticsearchAggregation.Run()
   191  		} else if *oldConfig.ElasticsearchSettings.EnableIndexing && !*newConfig.ElasticsearchSettings.EnableIndexing {
   192  			workers.ElasticsearchAggregation.Stop()
   193  		}
   194  	}
   195  
   196  	if workers.LdapSync != nil {
   197  		if !*oldConfig.LdapSettings.EnableSync && *newConfig.LdapSettings.EnableSync {
   198  			go workers.LdapSync.Run()
   199  		} else if *oldConfig.LdapSettings.EnableSync && !*newConfig.LdapSettings.EnableSync {
   200  			workers.LdapSync.Stop()
   201  		}
   202  	}
   203  
   204  	if workers.BleveIndexing != nil {
   205  		if !*oldConfig.BleveSettings.EnableIndexing && *newConfig.BleveSettings.EnableIndexing {
   206  			go workers.BleveIndexing.Run()
   207  		} else if *oldConfig.BleveSettings.EnableIndexing && !*newConfig.BleveSettings.EnableIndexing {
   208  			workers.BleveIndexing.Stop()
   209  		}
   210  	}
   211  }
   212  
   213  func (workers *Workers) Stop() *Workers {
   214  	workers.ConfigService.RemoveConfigListener(workers.listenerId)
   215  
   216  	workers.Watcher.Stop()
   217  
   218  	if workers.DataRetention != nil && (*workers.ConfigService.Config().DataRetentionSettings.EnableMessageDeletion || *workers.ConfigService.Config().DataRetentionSettings.EnableFileDeletion) {
   219  		workers.DataRetention.Stop()
   220  	}
   221  
   222  	if workers.MessageExport != nil && *workers.ConfigService.Config().MessageExportSettings.EnableExport {
   223  		workers.MessageExport.Stop()
   224  	}
   225  
   226  	if workers.ElasticsearchIndexing != nil && *workers.ConfigService.Config().ElasticsearchSettings.EnableIndexing {
   227  		workers.ElasticsearchIndexing.Stop()
   228  	}
   229  
   230  	if workers.ElasticsearchAggregation != nil && *workers.ConfigService.Config().ElasticsearchSettings.EnableIndexing {
   231  		workers.ElasticsearchAggregation.Stop()
   232  	}
   233  
   234  	if workers.LdapSync != nil && *workers.ConfigService.Config().LdapSettings.EnableSync {
   235  		workers.LdapSync.Stop()
   236  	}
   237  
   238  	if workers.Migrations != nil {
   239  		workers.Migrations.Stop()
   240  	}
   241  
   242  	if workers.Plugins != nil {
   243  		workers.Plugins.Stop()
   244  	}
   245  
   246  	if workers.BleveIndexing != nil && *workers.ConfigService.Config().BleveSettings.EnableIndexing {
   247  		workers.BleveIndexing.Stop()
   248  	}
   249  
   250  	if workers.ExpiryNotify != nil {
   251  		workers.ExpiryNotify.Stop()
   252  	}
   253  
   254  	if workers.ActiveUsers != nil {
   255  		workers.ActiveUsers.Stop()
   256  	}
   257  
   258  	if workers.ProductNotices != nil {
   259  		workers.ProductNotices.Stop()
   260  	}
   261  
   262  	if workers.ImportProcess != nil {
   263  		workers.ImportProcess.Stop()
   264  	}
   265  
   266  	if workers.Cloud != nil {
   267  		workers.Cloud.Stop()
   268  	}
   269  
   270  	mlog.Info("Stopped workers")
   271  
   272  	return workers
   273  }