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