github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/gc/worker_collector.go (about) 1 package gc 2 3 import ( 4 "context" 5 "time" 6 7 "code.cloudfoundry.org/lager" 8 "code.cloudfoundry.org/lager/lagerctx" 9 "github.com/pf-qiu/concourse/v6/atc/db" 10 "github.com/pf-qiu/concourse/v6/atc/metric" 11 ) 12 13 type workerCollector struct { 14 workerLifecycle db.WorkerLifecycle 15 } 16 17 func NewWorkerCollector(workerLifecycle db.WorkerLifecycle) *workerCollector { 18 return &workerCollector{ 19 workerLifecycle: workerLifecycle, 20 } 21 } 22 23 func (wc *workerCollector) Run(ctx context.Context) error { 24 logger := lagerctx.FromContext(ctx).Session("worker-collector") 25 26 logger.Debug("start") 27 defer logger.Debug("done") 28 29 start := time.Now() 30 defer func() { 31 metric.WorkerCollectorDuration{ 32 Duration: time.Since(start), 33 }.Emit(logger) 34 }() 35 36 affected, err := wc.workerLifecycle.DeleteUnresponsiveEphemeralWorkers() 37 if err != nil { 38 logger.Error("failed-to-remove-dead-ephemeral-workers", err) 39 return err 40 } 41 42 if len(affected) > 0 { 43 logger.Info("ephemeral-workers-removed", lager.Data{"count": len(affected), "workers": affected}) 44 } 45 46 affected, err = wc.workerLifecycle.StallUnresponsiveWorkers() 47 if err != nil { 48 logger.Error("failed-to-mark-workers-as-stalled", err) 49 return err 50 } 51 52 if len(affected) > 0 { 53 logger.Info("marked-workers-as-stalled", lager.Data{"count": len(affected), "workers": affected}) 54 } 55 56 affected, err = wc.workerLifecycle.DeleteFinishedRetiringWorkers() 57 if err != nil { 58 logger.Error("failed-to-delete-finished-retiring-workers", err) 59 return err 60 } 61 62 if len(affected) > 0 { 63 logger.Info("marked-workers-as-retired", lager.Data{"count": len(affected), "workers": affected}) 64 } 65 66 affected, err = wc.workerLifecycle.LandFinishedLandingWorkers() 67 if err != nil { 68 logger.Error("failed-to-land-finished-landing-workers", err) 69 return err 70 } 71 72 if len(affected) > 0 { 73 logger.Info("marked-workers-as-landed", lager.Data{"count": len(affected), "workers": affected}) 74 } 75 76 workerStateByName, err := wc.workerLifecycle.GetWorkerStateByName() 77 78 if err != nil { 79 logger.Error("failed-to-get-workers-states-for-metrics", err) 80 } else { 81 metric.WorkersState{ 82 WorkerStateByName: workerStateByName, 83 }.Emit(logger, metric.Metrics) 84 } 85 86 return nil 87 }