github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/builds/tracker.go (about)

     1  package builds
     2  
     3  import (
     4  	"context"
     5  	"sync"
     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/engine"
    11  	"github.com/pf-qiu/concourse/v6/atc/metric"
    12  	"github.com/pf-qiu/concourse/v6/atc/util"
    13  )
    14  
    15  func NewTracker(
    16  	buildFactory db.BuildFactory,
    17  	engine engine.Engine,
    18  ) *Tracker {
    19  	return &Tracker{
    20  		buildFactory: buildFactory,
    21  		engine:       engine,
    22  		running:      &sync.Map{},
    23  	}
    24  }
    25  
    26  type Tracker struct {
    27  	logger lager.Logger
    28  
    29  	buildFactory db.BuildFactory
    30  	engine       engine.Engine
    31  
    32  	running *sync.Map
    33  }
    34  
    35  func (bt *Tracker) Run(ctx context.Context) error {
    36  	logger := lagerctx.FromContext(ctx)
    37  
    38  	logger.Debug("start")
    39  	defer logger.Debug("done")
    40  
    41  	builds, err := bt.buildFactory.GetAllStartedBuilds()
    42  	if err != nil {
    43  		logger.Error("failed-to-lookup-started-builds", err)
    44  		return err
    45  	}
    46  
    47  	for _, b := range builds {
    48  		if _, exists := bt.running.LoadOrStore(b.ID(), true); !exists {
    49  			go func(build db.Build) {
    50  				loggerData := build.LagerData()
    51  				defer func() {
    52  					err := util.DumpPanic(recover(), "tracking build %d", build.ID())
    53  					if err != nil {
    54  						logger.Error("panic-in-tracker-build-run", err)
    55  
    56  						build.Finish(db.BuildStatusErrored)
    57  					}
    58  				}()
    59  
    60  				defer bt.running.Delete(build.ID())
    61  
    62  				metric.Metrics.BuildsRunning.Inc()
    63  				defer metric.Metrics.BuildsRunning.Dec()
    64  
    65  				bt.engine.NewBuild(build).Run(
    66  					lagerctx.NewContext(
    67  						context.Background(),
    68  						logger.Session("run", loggerData),
    69  					),
    70  				)
    71  			}(b)
    72  		}
    73  	}
    74  
    75  	return nil
    76  }
    77  
    78  func (bt *Tracker) Drain(ctx context.Context) {
    79  	bt.engine.Drain(ctx)
    80  }