github.com/rifflearning/mattermost-server@v5.11.1+incompatible/jobs/workers.go (about)

     1  // Copyright (c) 2017-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/mattermost/mattermost-server/mlog"
    10  	"github.com/mattermost/mattermost-server/model"
    11  	"github.com/mattermost/mattermost-server/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  
    27  	listenerId string
    28  }
    29  
    30  func (srv *JobServer) InitWorkers() *Workers {
    31  	workers := &Workers{
    32  		ConfigService: srv.ConfigService,
    33  	}
    34  	workers.Watcher = srv.MakeWatcher(workers, DEFAULT_WATCHER_POLLING_INTERVAL)
    35  
    36  	if srv.DataRetentionJob != nil {
    37  		workers.DataRetention = srv.DataRetentionJob.MakeWorker()
    38  	}
    39  
    40  	if srv.MessageExportJob != nil {
    41  		workers.MessageExport = srv.MessageExportJob.MakeWorker()
    42  	}
    43  
    44  	if elasticsearchIndexerInterface := srv.ElasticsearchIndexer; elasticsearchIndexerInterface != nil {
    45  		workers.ElasticsearchIndexing = elasticsearchIndexerInterface.MakeWorker()
    46  	}
    47  
    48  	if elasticsearchAggregatorInterface := srv.ElasticsearchAggregator; elasticsearchAggregatorInterface != nil {
    49  		workers.ElasticsearchAggregation = elasticsearchAggregatorInterface.MakeWorker()
    50  	}
    51  
    52  	if ldapSyncInterface := srv.LdapSync; ldapSyncInterface != nil {
    53  		workers.LdapSync = ldapSyncInterface.MakeWorker()
    54  	}
    55  
    56  	if migrationsInterface := srv.Migrations; migrationsInterface != nil {
    57  		workers.Migrations = migrationsInterface.MakeWorker()
    58  	}
    59  
    60  	if pluginsInterface := srv.Plugins; pluginsInterface != nil {
    61  		workers.Plugins = pluginsInterface.MakeWorker()
    62  	}
    63  
    64  	return workers
    65  }
    66  
    67  func (workers *Workers) Start() *Workers {
    68  	mlog.Info("Starting workers")
    69  
    70  	workers.startOnce.Do(func() {
    71  		if workers.DataRetention != nil && (*workers.ConfigService.Config().DataRetentionSettings.EnableMessageDeletion || *workers.ConfigService.Config().DataRetentionSettings.EnableFileDeletion) {
    72  			go workers.DataRetention.Run()
    73  		}
    74  
    75  		if workers.MessageExport != nil && *workers.ConfigService.Config().MessageExportSettings.EnableExport {
    76  			go workers.MessageExport.Run()
    77  		}
    78  
    79  		if workers.ElasticsearchIndexing != nil && *workers.ConfigService.Config().ElasticsearchSettings.EnableIndexing {
    80  			go workers.ElasticsearchIndexing.Run()
    81  		}
    82  
    83  		if workers.ElasticsearchAggregation != nil && *workers.ConfigService.Config().ElasticsearchSettings.EnableIndexing {
    84  			go workers.ElasticsearchAggregation.Run()
    85  		}
    86  
    87  		if workers.LdapSync != nil && *workers.ConfigService.Config().LdapSettings.EnableSync {
    88  			go workers.LdapSync.Run()
    89  		}
    90  
    91  		if workers.Migrations != nil {
    92  			go workers.Migrations.Run()
    93  		}
    94  
    95  		if workers.Plugins != nil {
    96  			go workers.Plugins.Run()
    97  		}
    98  
    99  		go workers.Watcher.Start()
   100  	})
   101  
   102  	workers.listenerId = workers.ConfigService.AddConfigListener(workers.handleConfigChange)
   103  
   104  	return workers
   105  }
   106  
   107  func (workers *Workers) handleConfigChange(oldConfig *model.Config, newConfig *model.Config) {
   108  	mlog.Debug("Workers received config change.")
   109  
   110  	if workers.DataRetention != nil {
   111  		if (!*oldConfig.DataRetentionSettings.EnableMessageDeletion && !*oldConfig.DataRetentionSettings.EnableFileDeletion) && (*newConfig.DataRetentionSettings.EnableMessageDeletion || *newConfig.DataRetentionSettings.EnableFileDeletion) {
   112  			go workers.DataRetention.Run()
   113  		} else if (*oldConfig.DataRetentionSettings.EnableMessageDeletion || *oldConfig.DataRetentionSettings.EnableFileDeletion) && (!*newConfig.DataRetentionSettings.EnableMessageDeletion && !*newConfig.DataRetentionSettings.EnableFileDeletion) {
   114  			workers.DataRetention.Stop()
   115  		}
   116  	}
   117  
   118  	if workers.MessageExport != nil {
   119  		if !*oldConfig.MessageExportSettings.EnableExport && *newConfig.MessageExportSettings.EnableExport {
   120  			go workers.MessageExport.Run()
   121  		} else if *oldConfig.MessageExportSettings.EnableExport && !*newConfig.MessageExportSettings.EnableExport {
   122  			workers.MessageExport.Stop()
   123  		}
   124  	}
   125  
   126  	if workers.ElasticsearchIndexing != nil {
   127  		if !*oldConfig.ElasticsearchSettings.EnableIndexing && *newConfig.ElasticsearchSettings.EnableIndexing {
   128  			go workers.ElasticsearchIndexing.Run()
   129  		} else if *oldConfig.ElasticsearchSettings.EnableIndexing && !*newConfig.ElasticsearchSettings.EnableIndexing {
   130  			workers.ElasticsearchIndexing.Stop()
   131  		}
   132  	}
   133  
   134  	if workers.ElasticsearchAggregation != nil {
   135  		if !*oldConfig.ElasticsearchSettings.EnableIndexing && *newConfig.ElasticsearchSettings.EnableIndexing {
   136  			go workers.ElasticsearchAggregation.Run()
   137  		} else if *oldConfig.ElasticsearchSettings.EnableIndexing && !*newConfig.ElasticsearchSettings.EnableIndexing {
   138  			workers.ElasticsearchAggregation.Stop()
   139  		}
   140  	}
   141  
   142  	if workers.LdapSync != nil {
   143  		if !*oldConfig.LdapSettings.EnableSync && *newConfig.LdapSettings.EnableSync {
   144  			go workers.LdapSync.Run()
   145  		} else if *oldConfig.LdapSettings.EnableSync && !*newConfig.LdapSettings.EnableSync {
   146  			workers.LdapSync.Stop()
   147  		}
   148  	}
   149  }
   150  
   151  func (workers *Workers) Stop() *Workers {
   152  	workers.ConfigService.RemoveConfigListener(workers.listenerId)
   153  
   154  	workers.Watcher.Stop()
   155  
   156  	if workers.DataRetention != nil && (*workers.ConfigService.Config().DataRetentionSettings.EnableMessageDeletion || *workers.ConfigService.Config().DataRetentionSettings.EnableFileDeletion) {
   157  		workers.DataRetention.Stop()
   158  	}
   159  
   160  	if workers.MessageExport != nil && *workers.ConfigService.Config().MessageExportSettings.EnableExport {
   161  		workers.MessageExport.Stop()
   162  	}
   163  
   164  	if workers.ElasticsearchIndexing != nil && *workers.ConfigService.Config().ElasticsearchSettings.EnableIndexing {
   165  		workers.ElasticsearchIndexing.Stop()
   166  	}
   167  
   168  	if workers.ElasticsearchAggregation != nil && *workers.ConfigService.Config().ElasticsearchSettings.EnableIndexing {
   169  		workers.ElasticsearchAggregation.Stop()
   170  	}
   171  
   172  	if workers.LdapSync != nil && *workers.ConfigService.Config().LdapSettings.EnableSync {
   173  		workers.LdapSync.Stop()
   174  	}
   175  
   176  	if workers.Migrations != nil {
   177  		workers.Migrations.Stop()
   178  	}
   179  
   180  	if workers.Plugins != nil {
   181  		workers.Plugins.Stop()
   182  	}
   183  
   184  	mlog.Info("Stopped workers")
   185  
   186  	return workers
   187  }