diff --git a/vendor.mod b/vendor.mod index 91847a26e2..1e9d311a7c 100644 --- a/vendor.mod +++ b/vendor.mod @@ -61,7 +61,7 @@ require ( github.com/miekg/dns v1.1.43 github.com/mistifyio/go-zfs/v3 v3.0.1 github.com/mitchellh/copystructure v1.2.0 - github.com/moby/buildkit v0.12.3 + github.com/moby/buildkit v0.12.4 github.com/moby/ipvs v1.1.0 github.com/moby/locker v1.0.1 github.com/moby/patternmatcher v0.6.0 diff --git a/vendor.sum b/vendor.sum index 88e4d223bb..0379fed0d2 100644 --- a/vendor.sum +++ b/vendor.sum @@ -912,8 +912,8 @@ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zx github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mndrix/tap-go v0.0.0-20171203230836-629fa407e90b/go.mod h1:pzzDgJWZ34fGzaAZGFW22KVZDfyrYW+QABMrWnJBnSs= github.com/moby/buildkit v0.8.1/go.mod h1:/kyU1hKy/aYCuP39GZA9MaKioovHku57N6cqlKZIaiQ= -github.com/moby/buildkit v0.12.3 h1:cFaPVnyC0PwAP5xHHfzdU5v9rgQrCi6HnGSg3WuFKp4= -github.com/moby/buildkit v0.12.3/go.mod h1:adB4y0SxxX8trnrY+oEulb48ODLqPO6pKMF0ppGcCoI= +github.com/moby/buildkit v0.12.4 h1:yKZDsObXLKarXqUx7YMnaB+TKv810bBhq0XLFWbkjT0= +github.com/moby/buildkit v0.12.4/go.mod h1:XG74uz06nPWQpnxYwgCryrVidvor0+ElUxGosbZPQG4= github.com/moby/ipvs v1.1.0 h1:ONN4pGaZQgAx+1Scz5RvWV4Q7Gb+mvfRh3NsPS+1XQQ= github.com/moby/ipvs v1.1.0/go.mod h1:4VJMWuf098bsUMmZEiD4Tjk/O7mOn3l1PTD3s4OoYAs= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= diff --git a/vendor/github.com/moby/buildkit/solver/cachekey.go b/vendor/github.com/moby/buildkit/solver/cachekey.go index 398368716a..9617789de0 100644 --- a/vendor/github.com/moby/buildkit/solver/cachekey.go +++ b/vendor/github.com/moby/buildkit/solver/cachekey.go @@ -55,15 +55,17 @@ func (ck *CacheKey) Output() Index { } func (ck *CacheKey) clone() *CacheKey { + ck.mu.RLock() nk := &CacheKey{ ID: ck.ID, digest: ck.digest, vtx: ck.vtx, output: ck.output, - ids: map[*cacheManager]string{}, + ids: make(map[*cacheManager]string, len(ck.ids)), } for cm, id := range ck.ids { nk.ids[cm] = id } + ck.mu.RUnlock() return nk } diff --git a/vendor/github.com/moby/buildkit/solver/combinedcache.go b/vendor/github.com/moby/buildkit/solver/combinedcache.go index ffffbb3953..aed8aa90d5 100644 --- a/vendor/github.com/moby/buildkit/solver/combinedcache.go +++ b/vendor/github.com/moby/buildkit/solver/combinedcache.go @@ -101,34 +101,41 @@ func (cm *combinedCacheManager) Save(key *CacheKey, s Result, createdAt time.Tim } func (cm *combinedCacheManager) Records(ctx context.Context, ck *CacheKey) ([]*CacheRecord, error) { + ck.mu.RLock() if len(ck.ids) == 0 { + ck.mu.RUnlock() return nil, errors.Errorf("no results") } + cms := make([]*cacheManager, 0, len(ck.ids)) + for cm := range ck.ids { + cms = append(cms, cm) + } + ck.mu.RUnlock() + records := map[string]*CacheRecord{} var mu sync.Mutex eg, _ := errgroup.WithContext(context.TODO()) - for c := range ck.ids { - func(c *cacheManager) { - eg.Go(func() error { - recs, err := c.Records(ctx, ck) - if err != nil { - return err - } - mu.Lock() - for _, rec := range recs { - if _, ok := records[rec.ID]; !ok || c == cm.main { - if c == cm.main { - rec.Priority = 1 - } - records[rec.ID] = rec + for _, c := range cms { + c := c + eg.Go(func() error { + recs, err := c.Records(ctx, ck) + if err != nil { + return err + } + mu.Lock() + for _, rec := range recs { + if _, ok := records[rec.ID]; !ok || c == cm.main { + if c == cm.main { + rec.Priority = 1 } + records[rec.ID] = rec } - mu.Unlock() - return nil - }) - }(c) + } + mu.Unlock() + return nil + }) } if err := eg.Wait(); err != nil { diff --git a/vendor/github.com/moby/buildkit/solver/exporter.go b/vendor/github.com/moby/buildkit/solver/exporter.go index 78ce77c2d2..44e788ee20 100644 --- a/vendor/github.com/moby/buildkit/solver/exporter.go +++ b/vendor/github.com/moby/buildkit/solver/exporter.go @@ -85,8 +85,9 @@ func (e *exporter) ExportTo(ctx context.Context, t CacheExporterTarget, opt Cach r CacheExporterRecord selector digest.Digest } + k := e.k.clone() // protect against *CacheKey internal ids mutation from other exports - recKey := rootKey(e.k.Digest(), e.k.Output()) + recKey := rootKey(k.Digest(), k.Output()) rec := t.Add(recKey) allRec := []CacheExporterRecord{rec} @@ -97,7 +98,7 @@ func (e *exporter) ExportTo(ctx context.Context, t CacheExporterTarget, opt Cach } exportRecord := opt.ExportRoots - if len(e.k.Deps()) > 0 { + if len(deps) > 0 { exportRecord = true } @@ -126,7 +127,7 @@ func (e *exporter) ExportTo(ctx context.Context, t CacheExporterTarget, opt Cach if opt.CompressionOpt != nil { for _, r := range remotes { // record all remaining remotes as well rec := t.Add(recKey) - rec.AddResult(e.k.vtx, int(e.k.output), v.CreatedAt, r) + rec.AddResult(k.vtx, int(k.output), v.CreatedAt, r) variants = append(variants, rec) } } @@ -147,7 +148,7 @@ func (e *exporter) ExportTo(ctx context.Context, t CacheExporterTarget, opt Cach if opt.CompressionOpt != nil { for _, r := range remotes { // record all remaining remotes as well rec := t.Add(recKey) - rec.AddResult(e.k.vtx, int(e.k.output), v.CreatedAt, r) + rec.AddResult(k.vtx, int(k.output), v.CreatedAt, r) variants = append(variants, rec) } } @@ -155,7 +156,7 @@ func (e *exporter) ExportTo(ctx context.Context, t CacheExporterTarget, opt Cach if remote != nil { for _, rec := range allRec { - rec.AddResult(e.k.vtx, int(e.k.output), v.CreatedAt, remote) + rec.AddResult(k.vtx, int(k.output), v.CreatedAt, remote) } } allRec = append(allRec, variants...) @@ -198,7 +199,7 @@ func (e *exporter) ExportTo(ctx context.Context, t CacheExporterTarget, opt Cach } } - for cm, id := range e.k.ids { + for cm, id := range k.ids { if _, err := addBacklinks(t, rec, cm, id, bkm); err != nil { return nil, err } diff --git a/vendor/github.com/moby/buildkit/solver/llbsolver/history.go b/vendor/github.com/moby/buildkit/solver/llbsolver/history.go index ac0a5dd652..d055a7bf54 100644 --- a/vendor/github.com/moby/buildkit/solver/llbsolver/history.go +++ b/vendor/github.com/moby/buildkit/solver/llbsolver/history.go @@ -762,6 +762,9 @@ func (h *HistoryQueue) Listen(ctx context.Context, req *controlapi.BuildHistoryR }() } + // make a copy of events for active builds so we don't keep a lock during grpc send + actives := make([]*controlapi.BuildHistoryEvent, 0, len(h.active)) + for _, e := range h.active { if req.Ref != "" && e.Ref != req.Ref { continue @@ -769,7 +772,7 @@ func (h *HistoryQueue) Listen(ctx context.Context, req *controlapi.BuildHistoryR if _, ok := h.deleted[e.Ref]; ok { continue } - sub.send(&controlapi.BuildHistoryEvent{ + actives = append(actives, &controlapi.BuildHistoryEvent{ Type: controlapi.BuildHistoryEventType_STARTED, Record: e, }) @@ -777,6 +780,12 @@ func (h *HistoryQueue) Listen(ctx context.Context, req *controlapi.BuildHistoryR h.mu.Unlock() + for _, e := range actives { + if err := f(e); err != nil { + return err + } + } + if !req.ActiveOnly { events := []*controlapi.BuildHistoryEvent{} if err := h.opt.DB.View(func(tx *bolt.Tx) error { @@ -810,7 +819,7 @@ func (h *HistoryQueue) Listen(ctx context.Context, req *controlapi.BuildHistoryR } h.mu.Unlock() for _, e := range events { - if e.Record == nil { + if e == nil || e.Record == nil { continue } if err := f(e); err != nil { diff --git a/vendor/modules.txt b/vendor/modules.txt index 42e5103acb..466483e061 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -680,7 +680,7 @@ github.com/mitchellh/hashstructure/v2 # github.com/mitchellh/reflectwalk v1.0.2 ## explicit github.com/mitchellh/reflectwalk -# github.com/moby/buildkit v0.12.3 +# github.com/moby/buildkit v0.12.4 ## explicit; go 1.20 github.com/moby/buildkit/api/services/control github.com/moby/buildkit/api/types