github.com/dschalla/mattermost-server@v4.8.1-rc1+incompatible/jobs/testworker.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  	"context"
     8  	"time"
     9  
    10  	l4g "github.com/alecthomas/log4go"
    11  	"github.com/mattermost/mattermost-server/model"
    12  )
    13  
    14  type TestWorker struct {
    15  	srv     *JobServer
    16  	name    string
    17  	stop    chan bool
    18  	stopped chan bool
    19  	jobs    chan model.Job
    20  }
    21  
    22  func (srv *JobServer) MakeTestWorker(name string) *TestWorker {
    23  	return &TestWorker{
    24  		srv:     srv,
    25  		name:    name,
    26  		stop:    make(chan bool, 1),
    27  		stopped: make(chan bool, 1),
    28  		jobs:    make(chan model.Job),
    29  	}
    30  }
    31  
    32  func (worker *TestWorker) Run() {
    33  	l4g.Debug("Worker %v: Started", worker.name)
    34  
    35  	defer func() {
    36  		l4g.Debug("Worker %v: Finished", worker.name)
    37  		worker.stopped <- true
    38  	}()
    39  
    40  	for {
    41  		select {
    42  		case <-worker.stop:
    43  			l4g.Debug("Worker %v: Received stop signal", worker.name)
    44  			return
    45  		case job := <-worker.jobs:
    46  			l4g.Debug("Worker %v: Received a new candidate job.", worker.name)
    47  			worker.DoJob(&job)
    48  		}
    49  	}
    50  }
    51  
    52  func (worker *TestWorker) DoJob(job *model.Job) {
    53  	if claimed, err := worker.srv.ClaimJob(job); err != nil {
    54  		l4g.Error("Job: %v: Error occurred while trying to claim job: %v", job.Id, err.Error())
    55  		return
    56  	} else if !claimed {
    57  		return
    58  	}
    59  
    60  	cancelCtx, cancelCancelWatcher := context.WithCancel(context.Background())
    61  	cancelWatcherChan := make(chan interface{}, 1)
    62  	go worker.srv.CancellationWatcher(cancelCtx, job.Id, cancelWatcherChan)
    63  
    64  	defer cancelCancelWatcher()
    65  
    66  	counter := 0
    67  	for {
    68  		select {
    69  		case <-cancelWatcherChan:
    70  			l4g.Debug("Job %v: Job has been canceled via CancellationWatcher.", job.Id)
    71  			if err := worker.srv.SetJobCanceled(job); err != nil {
    72  				l4g.Error("Failed to mark job: %v as canceled. Error: %v", job.Id, err.Error())
    73  			}
    74  			return
    75  		case <-worker.stop:
    76  			l4g.Debug("Job %v: Job has been canceled via Worker Stop.", job.Id)
    77  			if err := worker.srv.SetJobCanceled(job); err != nil {
    78  				l4g.Error("Failed to mark job: %v as canceled. Error: %v", job.Id, err.Error())
    79  			}
    80  			return
    81  		case <-time.After(5 * time.Second):
    82  			counter++
    83  			if counter > 10 {
    84  				l4g.Debug("Job %v: Job completed.", job.Id)
    85  				if err := worker.srv.SetJobSuccess(job); err != nil {
    86  					l4g.Error("Failed to mark job: %v as succeeded. Error: %v", job.Id, err.Error())
    87  				}
    88  				return
    89  			} else {
    90  				if err := worker.srv.SetJobProgress(job, int64(counter*10)); err != nil {
    91  					l4g.Error("Job: %v: an error occured while trying to set job progress: %v", job.Id, err.Error())
    92  				}
    93  			}
    94  		}
    95  	}
    96  }
    97  
    98  func (worker *TestWorker) Stop() {
    99  	l4g.Debug("Worker %v: Stopping", worker.name)
   100  	worker.stop <- true
   101  	<-worker.stopped
   102  }
   103  
   104  func (worker *TestWorker) JobChannel() chan<- model.Job {
   105  	return worker.jobs
   106  }