github.com/nhannv/mattermost-server@v5.11.1+incompatible/plugin/scheduler/worker.go (about)

     1  // Copyright (c) 2018-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package scheduler
     5  
     6  import (
     7  	"github.com/mattermost/mattermost-server/app"
     8  	"github.com/mattermost/mattermost-server/jobs"
     9  	"github.com/mattermost/mattermost-server/mlog"
    10  	"github.com/mattermost/mattermost-server/model"
    11  )
    12  
    13  type Worker struct {
    14  	name      string
    15  	stop      chan bool
    16  	stopped   chan bool
    17  	jobs      chan model.Job
    18  	jobServer *jobs.JobServer
    19  	app       *app.App
    20  }
    21  
    22  func (m *PluginsJobInterfaceImpl) MakeWorker() model.Worker {
    23  	worker := Worker{
    24  		name:      "Plugins",
    25  		stop:      make(chan bool, 1),
    26  		stopped:   make(chan bool, 1),
    27  		jobs:      make(chan model.Job),
    28  		jobServer: m.App.Srv.Jobs,
    29  		app:       m.App,
    30  	}
    31  
    32  	return &worker
    33  }
    34  
    35  func (worker *Worker) Run() {
    36  	mlog.Debug("Worker started", mlog.String("worker", worker.name))
    37  
    38  	defer func() {
    39  		mlog.Debug("Worker finished", mlog.String("worker", worker.name))
    40  		worker.stopped <- true
    41  	}()
    42  
    43  	for {
    44  		select {
    45  		case <-worker.stop:
    46  			mlog.Debug("Worker received stop signal", mlog.String("worker", worker.name))
    47  			return
    48  		case job := <-worker.jobs:
    49  			mlog.Debug("Worker received a new candidate job.", mlog.String("worker", worker.name))
    50  			worker.DoJob(&job)
    51  		}
    52  	}
    53  }
    54  
    55  func (worker *Worker) Stop() {
    56  	mlog.Debug("Worker stopping", mlog.String("worker", worker.name))
    57  	worker.stop <- true
    58  	<-worker.stopped
    59  }
    60  
    61  func (worker *Worker) JobChannel() chan<- model.Job {
    62  	return worker.jobs
    63  }
    64  
    65  func (worker *Worker) DoJob(job *model.Job) {
    66  	if claimed, err := worker.jobServer.ClaimJob(job); err != nil {
    67  		mlog.Info("Worker experienced an error while trying to claim job",
    68  			mlog.String("worker", worker.name),
    69  			mlog.String("job_id", job.Id),
    70  			mlog.String("error", err.Error()))
    71  		return
    72  	} else if !claimed {
    73  		return
    74  	}
    75  
    76  	err := worker.app.DeleteAllExpiredPluginKeys()
    77  	if err == nil {
    78  		mlog.Info("Worker: Job is complete", mlog.String("worker", worker.name), mlog.String("job_id", job.Id))
    79  		worker.setJobSuccess(job)
    80  		return
    81  	} else {
    82  		mlog.Error("Worker: Failed to delete expired keys", mlog.String("worker", worker.name), mlog.String("job_id", job.Id), mlog.String("error", err.Error()))
    83  		worker.setJobError(job, err)
    84  		return
    85  	}
    86  }
    87  
    88  func (worker *Worker) setJobSuccess(job *model.Job) {
    89  	if err := worker.app.Srv.Jobs.SetJobSuccess(job); err != nil {
    90  		mlog.Error("Worker: Failed to set success for job", mlog.String("worker", worker.name), mlog.String("job_id", job.Id), mlog.String("error", err.Error()))
    91  		worker.setJobError(job, err)
    92  	}
    93  }
    94  
    95  func (worker *Worker) setJobError(job *model.Job, appError *model.AppError) {
    96  	if err := worker.app.Srv.Jobs.SetJobError(job, appError); err != nil {
    97  		mlog.Error("Worker: Failed to set job error", mlog.String("worker", worker.name), mlog.String("job_id", job.Id), mlog.String("error", err.Error()))
    98  	}
    99  }