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 }