github.com/keys-pub/mattermost-server@v4.10.10+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  )
    12  
    13  type Workers struct {
    14  	startOnce     sync.Once
    15  	ConfigService ConfigService
    16  	Watcher       *Watcher
    17  
    18  	DataRetention            model.Worker
    19  	MessageExport            model.Worker
    20  	ElasticsearchIndexing    model.Worker
    21  	ElasticsearchAggregation model.Worker
    22  	LdapSync                 model.Worker
    23  
    24  	listenerId string
    25  }
    26  
    27  func (srv *JobServer) InitWorkers() *Workers {
    28  	workers := &Workers{
    29  		ConfigService: srv.ConfigService,
    30  	}
    31  	workers.Watcher = srv.MakeWatcher(workers, DEFAULT_WATCHER_POLLING_INTERVAL)
    32  
    33  	if srv.DataRetentionJob != nil {
    34  		workers.DataRetention = srv.DataRetentionJob.MakeWorker()
    35  	}
    36  
    37  	if srv.MessageExportJob != nil {
    38  		workers.MessageExport = srv.MessageExportJob.MakeWorker()
    39  	}
    40  
    41  	if elasticsearchIndexerInterface := srv.ElasticsearchIndexer; elasticsearchIndexerInterface != nil {
    42  		workers.ElasticsearchIndexing = elasticsearchIndexerInterface.MakeWorker()
    43  	}
    44  
    45  	if elasticsearchAggregatorInterface := srv.ElasticsearchAggregator; elasticsearchAggregatorInterface != nil {
    46  		workers.ElasticsearchAggregation = elasticsearchAggregatorInterface.MakeWorker()
    47  	}
    48  
    49  	if ldapSyncInterface := srv.LdapSync; ldapSyncInterface != nil {
    50  		workers.LdapSync = ldapSyncInterface.MakeWorker()
    51  	}
    52  
    53  	return workers
    54  }
    55  
    56  func (workers *Workers) Start() *Workers {
    57  	mlog.Info("Starting workers")
    58  
    59  	workers.startOnce.Do(func() {
    60  		if workers.DataRetention != nil && (*workers.ConfigService.Config().DataRetentionSettings.EnableMessageDeletion || *workers.ConfigService.Config().DataRetentionSettings.EnableFileDeletion) {
    61  			go workers.DataRetention.Run()
    62  		}
    63  
    64  		if workers.MessageExport != nil && *workers.ConfigService.Config().MessageExportSettings.EnableExport {
    65  			go workers.MessageExport.Run()
    66  		}
    67  
    68  		if workers.ElasticsearchIndexing != nil && *workers.ConfigService.Config().ElasticsearchSettings.EnableIndexing {
    69  			go workers.ElasticsearchIndexing.Run()
    70  		}
    71  
    72  		if workers.ElasticsearchAggregation != nil && *workers.ConfigService.Config().ElasticsearchSettings.EnableIndexing {
    73  			go workers.ElasticsearchAggregation.Run()
    74  		}
    75  
    76  		if workers.LdapSync != nil && *workers.ConfigService.Config().LdapSettings.EnableSync {
    77  			go workers.LdapSync.Run()
    78  		}
    79  
    80  		go workers.Watcher.Start()
    81  	})
    82  
    83  	workers.listenerId = workers.ConfigService.AddConfigListener(workers.handleConfigChange)
    84  
    85  	return workers
    86  }
    87  
    88  func (workers *Workers) handleConfigChange(oldConfig *model.Config, newConfig *model.Config) {
    89  	if workers.DataRetention != nil {
    90  		if (!*oldConfig.DataRetentionSettings.EnableMessageDeletion && !*oldConfig.DataRetentionSettings.EnableFileDeletion) && (*newConfig.DataRetentionSettings.EnableMessageDeletion || *newConfig.DataRetentionSettings.EnableFileDeletion) {
    91  			go workers.DataRetention.Run()
    92  		} else if (*oldConfig.DataRetentionSettings.EnableMessageDeletion || *oldConfig.DataRetentionSettings.EnableFileDeletion) && (!*newConfig.DataRetentionSettings.EnableMessageDeletion && !*newConfig.DataRetentionSettings.EnableFileDeletion) {
    93  			workers.DataRetention.Stop()
    94  		}
    95  	}
    96  
    97  	if workers.MessageExport != nil {
    98  		if !*oldConfig.MessageExportSettings.EnableExport && *newConfig.MessageExportSettings.EnableExport {
    99  			go workers.MessageExport.Run()
   100  		} else if *oldConfig.MessageExportSettings.EnableExport && !*newConfig.MessageExportSettings.EnableExport {
   101  			workers.MessageExport.Stop()
   102  		}
   103  	}
   104  
   105  	if workers.ElasticsearchIndexing != nil {
   106  		if !*oldConfig.ElasticsearchSettings.EnableIndexing && *newConfig.ElasticsearchSettings.EnableIndexing {
   107  			go workers.ElasticsearchIndexing.Run()
   108  		} else if *oldConfig.ElasticsearchSettings.EnableIndexing && !*newConfig.ElasticsearchSettings.EnableIndexing {
   109  			workers.ElasticsearchIndexing.Stop()
   110  		}
   111  	}
   112  
   113  	if workers.ElasticsearchAggregation != nil {
   114  		if !*oldConfig.ElasticsearchSettings.EnableIndexing && *newConfig.ElasticsearchSettings.EnableIndexing {
   115  			go workers.ElasticsearchAggregation.Run()
   116  		} else if *oldConfig.ElasticsearchSettings.EnableIndexing && !*newConfig.ElasticsearchSettings.EnableIndexing {
   117  			workers.ElasticsearchAggregation.Stop()
   118  		}
   119  	}
   120  
   121  	if workers.LdapSync != nil {
   122  		if !*oldConfig.LdapSettings.EnableSync && *newConfig.LdapSettings.EnableSync {
   123  			go workers.LdapSync.Run()
   124  		} else if *oldConfig.LdapSettings.EnableSync && !*newConfig.LdapSettings.EnableSync {
   125  			workers.LdapSync.Stop()
   126  		}
   127  	}
   128  }
   129  
   130  func (workers *Workers) Stop() *Workers {
   131  	workers.ConfigService.RemoveConfigListener(workers.listenerId)
   132  
   133  	workers.Watcher.Stop()
   134  
   135  	if workers.DataRetention != nil && (*workers.ConfigService.Config().DataRetentionSettings.EnableMessageDeletion || *workers.ConfigService.Config().DataRetentionSettings.EnableFileDeletion) {
   136  		workers.DataRetention.Stop()
   137  	}
   138  
   139  	if workers.MessageExport != nil && *workers.ConfigService.Config().MessageExportSettings.EnableExport {
   140  		workers.MessageExport.Stop()
   141  	}
   142  
   143  	if workers.ElasticsearchIndexing != nil && *workers.ConfigService.Config().ElasticsearchSettings.EnableIndexing {
   144  		workers.ElasticsearchIndexing.Stop()
   145  	}
   146  
   147  	if workers.ElasticsearchAggregation != nil && *workers.ConfigService.Config().ElasticsearchSettings.EnableIndexing {
   148  		workers.ElasticsearchAggregation.Stop()
   149  	}
   150  
   151  	if workers.LdapSync != nil && *workers.ConfigService.Config().LdapSettings.EnableSync {
   152  		workers.LdapSync.Stop()
   153  	}
   154  
   155  	mlog.Info("Stopped workers")
   156  
   157  	return workers
   158  }