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 }