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  }