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 }