Skip to content

Commit

Permalink
Merge pull request #810 from Pix4D/merge-upstream-2025-03-07
Browse files Browse the repository at this point in the history
Merge upstream 2025 03 07
  • Loading branch information
aliculPix4D authored Mar 10, 2025
2 parents 722c10f + c479316 commit 83194c2
Show file tree
Hide file tree
Showing 118 changed files with 1,792 additions and 883 deletions.
3 changes: 2 additions & 1 deletion atc/atccmd/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -1120,6 +1120,7 @@ func (cmd *RunCommand) backendComponents(
Runnable: lidar.NewScanner(
dbCheckFactory,
atc.NewPlanFactory(time.Now().Unix()),
50,
),
},
{
Expand Down Expand Up @@ -1685,7 +1686,7 @@ func (cmd *RunCommand) constructDBConn(

// Instrument with Logging
if cmd.LogDBQueries {
dbConn = db.Log(logger.Session("log-conn"), dbConn)
dbConn = db.Log(logger.Session("log-dbconn"), dbConn)
}

// Prepare
Expand Down
30 changes: 16 additions & 14 deletions atc/builds/tracker.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package builds

import (
"context"
"fmt"
"sync"

"code.cloudfoundry.org/lager/v3"
Expand Down Expand Up @@ -64,7 +65,7 @@ func (bt *Tracker) Run(ctx context.Context) error {
}

for _, b := range builds {
bt.trackBuild(logger, b, true)
bt.trackBuild(logger, b)
}

return nil
Expand All @@ -74,14 +75,19 @@ func (bt *Tracker) Drain(ctx context.Context) {
bt.engine.Drain(ctx)
}

func (bt *Tracker) trackBuild(logger lager.Logger, b db.Build, dupCheck bool) {
if dupCheck {
if _, exists := bt.running.LoadOrStore(b.ID(), true); exists {
return
}
func (bt *Tracker) trackBuild(logger lager.Logger, b db.Build) {
var id string
if b.ID() != 0 {
id = fmt.Sprintf("build-%d", b.ID())
} else {
id = fmt.Sprintf("resource-%d", b.ResourceID())
}

if _, exists := bt.running.LoadOrStore(id, true); exists {
return
}

go func(build db.Build) {
go func(build db.Build, id string) {
loggerData := build.LagerData()
defer func() {
err := util.DumpPanic(recover(), "tracking build %d", build.ID())
Expand All @@ -92,11 +98,7 @@ func (bt *Tracker) trackBuild(logger lager.Logger, b db.Build, dupCheck bool) {
}
}()

defer func(dupCheck bool) {
if dupCheck {
bt.running.Delete(build.ID())
}
}(dupCheck)
defer bt.running.Delete(id)

if build.Name() == db.CheckBuildName {
metric.Metrics.CheckBuildsRunning.Inc()
Expand All @@ -112,7 +114,7 @@ func (bt *Tracker) trackBuild(logger lager.Logger, b db.Build, dupCheck bool) {
logger.Session("run", loggerData),
),
)
}(b)
}(b, id)
}

func (bt *Tracker) trackInMemoryBuilds(logger lager.Logger) {
Expand All @@ -127,7 +129,7 @@ func (bt *Tracker) trackInMemoryBuilds(logger lager.Logger) {
return
}
logger.Debug("received-in-memory-build", b.LagerData())
bt.trackBuild(logger, b, false)
bt.trackBuild(logger, b)
}
}
}
64 changes: 48 additions & 16 deletions atc/builds/tracker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ func (s *TrackerSuite) SetupTest() {

func (s *TrackerSuite) TestTrackRunsStartedBuilds() {
startedBuilds := []db.Build{}
for i := 0; i < 3; i++ {
for i := range 3 {
fakeBuild := new(dbfakes.FakeBuild)
fakeBuild.IDReturns(i + 1)
startedBuilds = append(startedBuilds, fakeBuild)
Expand Down Expand Up @@ -91,15 +91,6 @@ func (s *TrackerSuite) TestTrackRunsStartedBuilds() {

func (s *TrackerSuite) TestTrackInMemoryBuilds() {
inMemoryBuilds := []db.Build{}
for i := 0; i < 3; i++ {
fakeBuild := new(dbfakes.FakeBuild)
// When tracked, in-memory builds have no id yet, thus let's use fake
// team id to verify test result.
fakeBuild.IDReturns(0)
fakeBuild.TeamIDReturns(i + 1)
inMemoryBuilds = append(inMemoryBuilds, fakeBuild)
s.buildChan <- fakeBuild
}

running := make(chan db.Build, 3)
s.fakeEngine.NewBuildStub = func(build db.Build) builds.Runnable {
Expand All @@ -110,17 +101,27 @@ func (s *TrackerSuite) TestTrackInMemoryBuilds() {
return engineBuild
}

for i := range 3 {
fakeBuild := new(dbfakes.FakeBuild)
// When tracked, in-memory builds have no id yet, but they do have a
// resource ID
fakeBuild.IDReturns(0)
fakeBuild.ResourceIDReturns(i + 1)
inMemoryBuilds = append(inMemoryBuilds, fakeBuild)
s.buildChan <- fakeBuild
}

err := s.tracker.Run(context.TODO())
s.NoError(err)

s.ElementsMatch([]int{
inMemoryBuilds[0].TeamID(),
inMemoryBuilds[1].TeamID(),
inMemoryBuilds[2].TeamID(),
inMemoryBuilds[0].ResourceID(),
inMemoryBuilds[1].ResourceID(),
inMemoryBuilds[2].ResourceID(),
}, []int{
(<-running).TeamID(),
(<-running).TeamID(),
(<-running).TeamID(),
(<-running).ResourceID(),
(<-running).ResourceID(),
(<-running).ResourceID(),
})
}

Expand Down Expand Up @@ -207,6 +208,37 @@ func (s *TrackerSuite) TestTrackDoesntTrackAlreadyRunningBuilds() {
}
}

func (s *TrackerSuite) TestTrackDoesntTrackAlreadyRunningInMemoryChecks() {
fakeInMemoryCheck := new(dbfakes.FakeBuild)
fakeInMemoryCheck.IDReturns(0)
fakeInMemoryCheck.ResourceIDReturns(1)
s.fakeBuildFactory.GetAllStartedBuildsReturns([]db.Build{}, nil)

wait := make(chan struct{})
defer close(wait)

running := make(chan db.Build, 3)
s.fakeEngine.NewBuildStub = func(build db.Build) builds.Runnable {
engineBuild := new(buildsfakes.FakeRunnable)
engineBuild.RunStub = func(context.Context) {
running <- build
<-wait
}

return engineBuild
}

s.buildChan <- fakeInMemoryCheck
<-running
s.buildChan <- fakeInMemoryCheck

select {
case <-running:
s.Fail("another in-memory check was started!")
case <-time.After(100 * time.Millisecond):
}
}

func (s *TrackerSuite) TestTrackerDrainsEngine() {
var _ component.Drainable = s.tracker

Expand Down
52 changes: 28 additions & 24 deletions atc/config_diff.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,23 +14,23 @@ import (
)

type Index interface {
FindEquivalent(interface{}) (interface{}, bool)
Slice() []interface{}
FindEquivalent(any) (any, bool)
Slice() []any
}

type Diffs []Diff

type Diff struct {
Before interface{}
After interface{}
Before any
After any
}

type DisplayDiff struct {
Before *DisplayConfig
After *DisplayConfig
}

func name(v interface{}) string {
func name(v any) string {
return reflect.ValueOf(v).FieldByName("Name").String()
}

Expand Down Expand Up @@ -78,76 +78,76 @@ func (diff DisplayDiff) Render(to io.Writer) {

type GroupIndex GroupConfigs

func (index GroupIndex) Slice() []interface{} {
slice := make([]interface{}, len(index))
func (index GroupIndex) Slice() []any {
slice := make([]any, len(index))
for i, object := range index {
slice[i] = object
}

return slice
}

func (index GroupIndex) FindEquivalentWithOrder(obj interface{}) (interface{}, int, bool) {
func (index GroupIndex) FindEquivalentWithOrder(obj any) (any, int, bool) {
return GroupConfigs(index).Lookup(name(obj))
}

type VarSourceIndex VarSourceConfigs

func (index VarSourceIndex) Slice() []interface{} {
slice := make([]interface{}, len(index))
func (index VarSourceIndex) Slice() []any {
slice := make([]any, len(index))
for i, object := range index {
slice[i] = object
}

return slice
}

func (index VarSourceIndex) FindEquivalent(obj interface{}) (interface{}, bool) {
func (index VarSourceIndex) FindEquivalent(obj any) (any, bool) {
return VarSourceConfigs(index).Lookup(name(obj))
}

type JobIndex JobConfigs

func (index JobIndex) Slice() []interface{} {
slice := make([]interface{}, len(index))
func (index JobIndex) Slice() []any {
slice := make([]any, len(index))
for i, object := range index {
slice[i] = object
}

return slice
}

func (index JobIndex) FindEquivalent(obj interface{}) (interface{}, bool) {
func (index JobIndex) FindEquivalent(obj any) (any, bool) {
return JobConfigs(index).Lookup(name(obj))
}

type ResourceIndex ResourceConfigs

func (index ResourceIndex) Slice() []interface{} {
slice := make([]interface{}, len(index))
func (index ResourceIndex) Slice() []any {
slice := make([]any, len(index))
for i, object := range index {
slice[i] = object
}

return slice
}

func (index ResourceIndex) FindEquivalent(obj interface{}) (interface{}, bool) {
func (index ResourceIndex) FindEquivalent(obj any) (any, bool) {
return ResourceConfigs(index).Lookup(name(obj))
}

type ResourceTypeIndex ResourceTypes

func (index ResourceTypeIndex) Slice() []interface{} {
slice := make([]interface{}, len(index))
func (index ResourceTypeIndex) Slice() []any {
slice := make([]any, len(index))
for i, object := range index {
slice[i] = object
}

return slice
}

func (index ResourceTypeIndex) FindEquivalent(obj interface{}) (interface{}, bool) {
func (index ResourceTypeIndex) FindEquivalent(obj any) (any, bool) {
return ResourceTypes(index).Lookup(name(obj))
}

Expand Down Expand Up @@ -260,16 +260,20 @@ func renderDiff(to io.Writer, a, b string) {
}
}

func practicallyDifferent(a, b interface{}) bool {
func practicallyDifferent(a, b any) bool {
if reflect.DeepEqual(a, b) {
return false
}

// prevent silly things like 300 != 300.0 due to YAML vs. JSON
// inconsistencies
marshalledA, errA := yaml.Marshal(a)
marshalledB, errB := yaml.Marshal(b)

marshalledA, _ := yaml.Marshal(a)
marshalledB, _ := yaml.Marshal(b)
// If we can't marshal either value, they're different
if errA != nil || errB != nil {
return true
}

return !bytes.Equal(marshalledA, marshalledB)
}
Expand All @@ -292,7 +296,7 @@ func (c Config) Diff(out io.Writer, newConfig Config) bool {
varSourceDiffs := diffIndices(VarSourceIndex(c.VarSources), VarSourceIndex(newConfig.VarSources))
if len(varSourceDiffs) > 0 {
diffExists = true
fmt.Println("variable source:")
fmt.Fprintln(out, "variable source:")

for _, diff := range varSourceDiffs {
diff.Render(indent, "variable source")
Expand Down
Loading

0 comments on commit 83194c2

Please sign in to comment.