github.com/haalcala/mattermost-server-change-repo@v0.0.0-20210713015153-16753fbeee5f/plugin/scheduler/worker.go (about)

     1  // Copyright (c) 2015-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/v5/app"
     8  	"github.com/mattermost/mattermost-server/v5/jobs"
     9  	"github.com/mattermost/mattermost-server/v5/mlog"
    10  	"github.com/mattermost/mattermost-server/v5/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  	if err := worker.app.DeleteAllExpiredPluginKeys(); err != nil {
    77  		mlog.Error("Worker: Failed to delete expired keys", mlog.String("worker", worker.name), mlog.String("job_id", job.Id), mlog.String("error", err.Error()))
    78  		worker.setJobError(job, err)
    79  		return
    80  	}
    81  
    82  	mlog.Info("Worker: Job is complete", mlog.String("worker", worker.name), mlog.String("job_id", job.Id))
    83  	worker.setJobSuccess(job)
    84  }
    85  
    86  func (worker *Worker) setJobSuccess(job *model.Job) {
    87  	if err := worker.app.Srv().Jobs.SetJobSuccess(job); err != nil {
    88  		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()))
    89  		worker.setJobError(job, err)
    90  	}
    91  }
    92  
    93  func (worker *Worker) setJobError(job *model.Job, appError *model.AppError) {
    94  	if err := worker.app.Srv().Jobs.SetJobError(job, appError); err != nil {
    95  		mlog.Error("Worker: Failed to set job error", mlog.String("worker", worker.name), mlog.String("job_id", job.Id), mlog.String("error", err.Error()))
    96  	}
    97  }