@@ -34,6 +34,7 @@ import (
34
34
"github.com/moby/buildkit/util/compression"
35
35
"github.com/moby/buildkit/util/entitlements"
36
36
"github.com/moby/buildkit/util/grpcerrors"
37
+ "github.com/moby/buildkit/util/leaseutil"
37
38
"github.com/moby/buildkit/util/progress"
38
39
"github.com/moby/buildkit/util/tracing/detect"
39
40
"github.com/moby/buildkit/worker"
@@ -156,7 +157,7 @@ func (s *Solver) Bridge(b solver.Builder) frontend.FrontendLLBBridge {
156
157
return s .bridge (b )
157
158
}
158
159
159
- func (s * Solver ) recordBuildHistory (ctx context.Context , id string , req frontend.SolveRequest , exp ExporterRequest , j * solver.Job , usage * resources.SysSampler ) (func (* Result , []exporter.DescriptorReference , error ) error , error ) {
160
+ func (s * Solver ) recordBuildHistory (ctx context.Context , id string , req frontend.SolveRequest , exp ExporterRequest , j * solver.Job , usage * resources.SysSampler ) (func (context. Context , * Result , []exporter.DescriptorReference , error ) error , error ) {
160
161
stopTrace , err := detect .Recorder .Record (ctx )
161
162
if err != nil {
162
163
return nil , err
@@ -184,7 +185,7 @@ func (s *Solver) recordBuildHistory(ctx context.Context, id string, req frontend
184
185
return nil , err
185
186
}
186
187
187
- return func (res * Result , descrefs []exporter.DescriptorReference , err error ) error {
188
+ return func (ctx context. Context , res * Result , descrefs []exporter.DescriptorReference , err error ) error {
188
189
en := time .Now ()
189
190
rec .CompletedAt = & en
190
191
@@ -197,7 +198,7 @@ func (s *Solver) recordBuildHistory(ctx context.Context, id string, req frontend
197
198
}
198
199
}
199
200
200
- ctx , cancel := context .WithCancelCause (context . Background () )
201
+ ctx , cancel := context .WithCancelCause (ctx )
201
202
ctx , _ = context .WithTimeoutCause (ctx , 300 * time .Second , errors .WithStack (context .DeadlineExceeded ))
202
203
defer cancel (errors .WithStack (context .Canceled ))
203
204
@@ -509,7 +510,7 @@ func (s *Solver) Solve(ctx context.Context, id string, sessionID string, req fro
509
510
return nil , err1
510
511
}
511
512
defer func () {
512
- err = rec (resProv , descrefs , err )
513
+ err = rec (context . WithoutCancel ( ctx ), resProv , descrefs , err )
513
514
}()
514
515
}
515
516
@@ -585,6 +586,22 @@ func (s *Solver) Solve(ctx context.Context, id string, sessionID string, req fro
585
586
return nil , err
586
587
}
587
588
589
+ // Functions that create new objects in containerd (eg. content blobs) need to have a lease to ensure
590
+ // that the object is not garbage collected immediately. This is protected by the indivual components,
591
+ // but because creating a lease is not cheap and requires a disk write, we create a single lease here
592
+ // early and let all the exporters, cache export and provenance creation use the same one.
593
+ lm , err := s .leaseManager ()
594
+ if err != nil {
595
+ return nil , err
596
+ }
597
+ ctx , done , err := leaseutil .WithLease (ctx , lm , leaseutil .MakeTemporary )
598
+ if err != nil {
599
+ return nil , err
600
+ }
601
+ releasers = append (releasers , func () {
602
+ done (context .WithoutCancel (ctx ))
603
+ })
604
+
588
605
cacheExporters , inlineCacheExporter := splitCacheExporters (exp .CacheExporters )
589
606
590
607
var exporterResponse map [string ]string
@@ -747,6 +764,14 @@ func (s *Solver) runExporters(ctx context.Context, exporters []exporter.Exporter
747
764
return exporterResponse , descs , nil
748
765
}
749
766
767
+ func (s * Solver ) leaseManager () (* leaseutil.Manager , error ) {
768
+ w , err := defaultResolver (s .workerController )()
769
+ if err != nil {
770
+ return nil , err
771
+ }
772
+ return w .LeaseManager (), nil
773
+ }
774
+
750
775
func splitCacheExporters (exporters []RemoteCacheExporter ) (rest []RemoteCacheExporter , inline inlineCacheExporter ) {
751
776
rest = make ([]RemoteCacheExporter , 0 , len (exporters ))
752
777
for _ , exp := range exporters {
0 commit comments