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